首页 > 解决方案 > 熊猫列等于列减去“行名”行中的值

问题描述

我正在尝试做一些我认为很简单但绝对不适合我的事情......

我有一个看起来像这样的表(称为 dftl):

事件 框架 时间 帧_x 时间_x Frame_y 时间_y ...
事件 A 2 270 --------- -------- --------- -------- ...
事件 B 5 420 --------- -------- --------- -------- ...
事件 C 11 570 --------- -------- --------- -------- ...
事件 D 15 980 --------- -------- --------- -------- ...
事件 E 20 1120 --------- -------- --------- -------- ...
文件 姓名 姓名 姓名 姓名 姓名 姓名 ...

所有“帧”列都填充了与第一个相同范围的数字,“时间”列也是如此。

我要创建:newdftl = dftl[columns] - dftl[columns][Event C]

因此,对于第一个 Frame 列,所有行都等于它们的值减去对应于事件 C 的行中该列中的值(对于 Frame/Event A 中的单元格,它是 2 - 11),如下所示:

事件 框架 时间 帧_x 时间_x Frame_y 时间_y ...
事件 A -9 -300 --------- -------- --------- -------- ...
事件 B -6 -150 --------- -------- --------- -------- ...
事件 C 0 0 --------- -------- --------- -------- ...
事件 D 4 410 --------- -------- --------- -------- ...
事件 E 9 550 --------- -------- --------- -------- ...
文件 姓名 姓名 姓名 姓名 姓名 姓名 ...

我的猜测是,首先我需要摆脱或排除最后一行来做到这一点,因为这些不是数字。但最重要的是,我不知道如何进行手术。

我还考虑过转置表格,认为它会对我有所帮助,但我仍然不知道如何进行该操作。

预先感谢您的所有帮助!

奥罗赫纳

标签: pythonpython-3.xpandas

解决方案


样本数据:

import pandas as pd
data = {'Event': {0: 'Event A', 1: 'Event B', 2: 'Event C', 3: 'Event D', 4: 'Event E'}, 'Frame': {0: 2, 1: 5, 2: 11, 3: 15, 4: 20}, 'Time': {0: 270, 1: 420, 2: 570, 3: 980, 4: 1120}}
df = pd.DataFrame(data)

代码:

df['Frame'] = df['Frame'] - df['Frame'].loc[df['Event'] == 'Event C'].iloc[0]
df['Time'] = df['Time'] - df['Time'].loc[df['Event'] == 'Event C'].iloc[0]

输出:

print(df)

     Event  Frame  Time
0  Event A     -9  -300
1  Event B     -6  -150
2  Event C      0     0
3  Event D      4   410
4  Event E      9   550

根据评论中的要求(将其应用于多个列):

import numpy as np
cols = ['Frame', 'Time']
df[cols] = df[cols] - pd.DataFrame(np.repeat(df[df['Event'].eq('Event C')].values,len(df),axis=0), columns=df.columns)[cols]

推荐阅读