我有一个带有名称列的数据框,对于每个名称,我想计算第一个值和其他每个值之间的差异.

数据帧

        Name   First Run    Second Run  Third Run   Time
0      Jakub    315            279        276       9:00
1      Jakub    322            260        270       9:00
2      Jakub    248            260        213       15:00
3      Jakub    246            288        294       15:00
4      Jakub    276            274        263       15:00
5      Bene     222            268        246       9:00
6      Bene     236            302        263       9:00
7      Bene     208            245        224       15:00
8      Bene     283            245        245       15:00
9      Bene     278            257        249       15:00

first_values = df.groupby(['Name']).first()[['First Run','Second Run','Third Run']]

         First Run        Second Run    Third Run   Time
Name            
Jakub       315             279          276        9:00
Bene        222             268          246        9:00

输出_df

        Name   First Run    Second Run  Third Run   Time
0      Jakub    0              0           0        9:00
1      Jakub    7              -19        -6        9:00
2      Jakub    -67            -19        -63       15:00
3      Jakub    -69            9          18        15:00
4      Jakub    -39            -5         -13       15:00
5      Bene     0              0          0         9:00
6      Bene     14             34         17        9:00
7      Bene     -14            -23        22        15:00
8      Bene     61             -23        -1        15:00
9      Bene     56             -9         3         15:00

我可以找出正确的函数来获得所需的输出.我try 了下面的代码,但我得到了一个打字错误.

df.Name.map(first_values.index).sub(first_values)

推荐答案

您可以使用groupby+apply并减go 每组的第一行:

df.filter(like=' Run').groupby(df['Name']).apply(lambda g: g-g.iloc[0])

或者从手动列列表中:

cols = ['First Run','Second Run','Third Run']
df[cols].groupby(df['Name']).apply(lambda g: g-g.iloc[0])

拥有新数据帧的完整代码:

df_output = df.copy()
df_output.update(df.filter(like=' Run')
                   .groupby(df['Name'])
                   .apply(lambda g: g-g.iloc[0])
                 )

输出:

    Name  First Run  Second Run  Third Run   Time
0  Jakub          0           0          0   9:00
1  Jakub          7         -19         -6   9:00
2  Jakub        -67         -19        -63  15:00
3  Jakub        -69           9         18  15:00
4  Jakub        -39          -5        -13  15:00
5   Bene          0           0          0   9:00
6   Bene         14          34         17   9:00
7   Bene        -14         -23        -22  15:00
8   Bene         61         -23         -1  15:00
9   Bene         56         -11          3  15:00

Python相关问答推荐

在pandas DataFrame上运行apply()时如何访问DateTime索引?

如何使用scikit-learn Python库中的Agglomerative集群算法以及集群中声明的对象数量?

在两极中实施频率编码

请从Python访问kivy子部件的功能需要帮助

在应用循环中间保存pandas DataFrame

Python中的负前瞻性regex遇到麻烦

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

三个给定的坐标可以是矩形的点吗

根据条件将新值添加到下面的行或下面新创建的行中

对某些列的总数进行民意调查,但不单独列出每列

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

如果值不存在,列表理解返回列表

如何获取TFIDF Transformer中的值?

使用密钥字典重新配置嵌套字典密钥名

移动条情节旁边的半小提琴情节在海运

合并帧,但不按合并键排序

Flash只从html表单中获取一个值

numpy.unique如何消除重复列?

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

从旋转的DF查询非NaN值