在pandas数据框中设置列值,其中单元格和值都以行中的元素为条件

pcww981p  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(79)

我有一个dataframe,看起来像这样:

import pandas as pd
df = pd.DataFrame({/
'Time': ['0','0','0','1','1','1','2','2','2'],/
'Animal': ['Cat', 'Dog', 'Pig', 'Cat', 'Dog', 'Pig', 'Cat', 'Dog', 'Pig'],/
'Displacement': ['1', '3', '2', '4', '2', '3', '1', '4', '6']/
})

我想添加一个名为“RelativeDisplacement”的新列,它的位移值减去动物在零时间的位移值
我可以通过迭代行来使它工作,例如。

rDisplacement0 = df[df['Time']=='0'][df['Animal']=='Cat']['Displacement'][0]

rDisplacements = []

for row in df.iterrows():
    if row[1]['Animal'] == 'Cat':
    
        rDisplacements.append(row[1]['Displacement'] - rDisplacement0 )

但这似乎不是一个很好的解决方案。我相信会有一个很好的矢量化方法来做到这一点,但我不能工作出来。任何帮助将不胜感激。

rggaifut

rggaifut1#

您可以map时间0的值:

# ensure integers for arithmetic
df['Displacement'] = df['Displacement'].astype(int)

df['RelativeDisplacement'] = (
    df['Displacement']
    .sub(df['Animal'].map(df.loc[df['Time'].eq('0')]
                            .set_index('Animal')['Displacement']))

或者,如果时间按升序排序,则使用groupby.transform

df['RelativeDisplacement'] = df['Displacement'].sub(df.groupby('Animal')['Displacement'].transform('first'))

输出:

Time Animal  Displacement  RelativeDisplacement
0    0    Cat             1                     0
1    0    Dog             3                     0
2    0    Pig             2                     0
3    1    Cat             4                     3
4    1    Dog             2                    -1
5    1    Pig             3                     1
6    2    Cat             1                     0
7    2    Dog             4                     1
8    2    Pig             6                     4

相关问题