Pandas通过查找与flag id的差异进行分组

k3fezbri  于 2023-06-20  发布在  其他
关注(0)|答案(4)|浏览(119)

我有以下 Dataframe :

id  flag  col_1  col_2  name
0   1   1      11    13      a
1   2   0      62    14      b 
2   1   0      13    15      a   
3   2   1      74    16      b  
4   3   1      25    17      c
5   3   0      22    18      c

我需要这个作为输出-

id  col_3  col_4  name
0   1     2       2     a
1   2   -12      -2     b 
2   3    -3       1     c

我需要按id,name分组,并取col_1的flag[0]-具有共同id,name的col_1的flag[1]。先谢谢你了。

e4yzc0pl

e4yzc0pl1#

另一种可能的解决方案:

out = (
    df.groupby(["id", "name"])
        .apply(lambda g: -g.pop("flag").diff().max() * g.diff())
        .dropna().droplevel(2).reset_index()
)

输出:

print(out)

   id name  col_1  col_2
0   1    a   2.00   2.00
1   2    b -12.00  -2.00
2   3    c  -3.00   1.00
qyuhtwio

qyuhtwio2#

使用带有临时索引的简单索引(set_indexreset_index

tmp = df.set_index(['flag', 'id', 'name'])

out = (tmp.loc[0] - tmp.loc[1]).reset_index()

输出:

id name  col_1  col_2
0   1    a      2      2
1   2    b    -12     -2
2   3    c     -3      1

使用的输入:

df = pd.DataFrame({'id': [1, 2, 1, 2, 3, 3],
                   'flag': [1, 0, 0, 1, 1, 0],
                   'col_1': [11, 62, 13, 74, 25, 22],
                   'col_2': [13, 14, 15, 16, 17, 18],
                   'name': ['a', 'b', 'a', 'b', 'c', 'c']})
ztyzrc3y

ztyzrc3y3#

使用DataFrame.pivot进行整形,因此可以通过flagDataFrame.xs选择0/1级别并减去,最后将Mulitindex in index转换为DataFrame.reset_index列并通过DataFrame.reindex获得列的原始顺序(过滤出flag列):

df1 = df.pivot(index=['id','name'], columns='flag')

out = (df1.xs(0, axis=1, level=1).sub(df1.xs(1, axis=1, level=1))
          .reset_index()
          .reindex(df.columns.difference(['flag'], sort=False), axis=1))
print (out)
   id  col_1  col_2 name
0   1      2      2    a
1   2    -12     -2    b
2   3     -3      1    c
uxhixvfz

uxhixvfz4#

另一种可能的解决方案:

(df.groupby(['id', 'name'])[['flag', 'col_1', 'col_2']]
 .apply(lambda x: x.sort_values('flag', ascending=False).diff())
 .dropna().droplevel(2).drop('flag', axis=1).reset_index())

输出:

id name  col_1  col_2
0   1    a    2.0    2.0
1   2    b  -12.0   -2.0
2   3    c   -3.0    1.0

相关问题