使用DataFrame中不同组内的引用行来执行数据操作

鉴于此数据帧

df = pd.DataFrame({'Group': {0: 'a', 1: 'a', 2: 'b', 3: 'b', 4: 'c', 5: 'c', 6: 'd', 7: 'd'},
'Time': {0: 0, 1: 1, 2: 0, 3: 1, 4: 0, 5: 1, 6: 0, 7: 1},
'Mean': {0: 1, 1: 4, 2: 1, 3: 5, 4: 2, 5: 6, 6: 2, 7: 9}})

对于 DataFrame ( aand b)中的每个组,我想取Mean列中的每个数字并将其除以对应的值在Time == 0,并取np.log2这个。换句话说,我想以这个结束

df2 = pd.DataFrame({'Group': {0: 'a', 1: 'a', 2: 'b', 3: 'b', 4: 'c', 5: 'c', 6: 'd', 7: 'd'},
 'Time': {0: 0, 1: 1, 2: 0, 3: 1, 4: 0, 5: 1, 6: 0, 7: 1},
 'Mean': {0: 1, 1: 4, 2: 1, 3: 5, 4: 2, 5: 6, 6: 2, 7: 9},
 'New': {0: 0.0, 1: 2.0, 2: 0.0, 3: 2.321928094887362, 4: 0.0, 5: 1.584962500721156, 6: 0.0, 7: 2.169925001442312}})

目前我通过以下方式实现了这一点

df2 = pd.DataFrame()
for group, sub in df.groupby('Group'):
    sub['New'] = np.log2(sub.Mean / sub.Mean.iloc[0])
    df2 = pd.concat([df2, sub], axis=0)

但我觉得应该有一个更简单的方法。

回答

您可以groupby使用转换first(替换iloc[0])然后与Mean列分开。

df['New'] = np.log2(df['Mean']/df.groupby("Group")['Mean'].transform('first'))

  Group  Time  Mean       New
0     a     0     1  0.000000
1     a     1     4  2.000000
2     b     0     1  0.000000
3     b     1     5  2.321928
4     c     0     2  0.000000
5     c     1     6  1.584963
6     d     0     2  0.000000
7     d     1     9  2.169925

编辑:

如果您不确定 Time 等于 0 的索引,您也可以执行以下操作:

df['New'] = (np.log2(df['Mean']/df.loc[df['Time'].eq(0).groupby(df['Group'])
               .transform('idxmax'),'Mean'].to_numpy()))

当 cond Time=0 为 True 时,这将为每个组返回最大索引。,然后使用df.loc我们返回均值列并将其用于除法。有关更多信息,请参阅idxmax工作原理


print(df)

  Group  Time  Mean       New
0     a     0     1  0.000000
1     a     1     4  2.000000
2     b     0     1  0.000000
3     b     1     5  2.321928
4     c     0     2  0.000000
5     c     1     6  1.584963
6     d     0     2  0.000000
7     d     1     9  2.169925


以上是使用DataFrame中不同组内的引用行来执行数据操作的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>