根据另一列的值向Python pandas数据框添加列
我有一个 pandas 数据框,想要添加一列,这一列的值是根据第三列的值计算出来的,表示某一列的差值。下面是一个简单的例子:
import pandas as pd
import numpy as np
d = {'one' : pd.Series(range(4), index=['a', 'b', 'c', 'd']),
'two' : pd.Series(range(4), index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
df['three'] = [2,2,3,3]
four = []
for i in set(df['three']):
for j in range(len(df) -1):
four.append(df[df['three'] == i]['two'][j + 1] - df[df['three']==i]['two'][j])
four.append(0)
df['four'] = four
最终得到的这一列应该是 [1, 1, 1, Nan],因为这是 'two' 列中每一行之间的差值。
这样说可能更容易理解,因为在我最开始的代码中,我的数据框是按一些 ID 排序的,然后再按时间排序。当我根据 ID 提取数据框的子集时,我得到的是每个 ID 的变量随时间变化的情况。不过,我总是遇到键错误,或者试图修改原始数据框的副本。请问我该怎么做才对呢?
2 个回答
0
如果你只是想计算第二列每一行之间的差值,可以使用 shift 这个方法。
df['four'] = df.two.shift(-1) - df.two
0
你可以用对第三列进行 groupby
操作来替代 df[df['three'] == i]
。而且,可以把 ['two'][j + 1] - ['two'][j]
替换成 df['two'].shift(-1) - df['two']
。
我觉得这样做的结果和你现在在嵌套循环中做的事情是一样的。具体怎么实现还得看你想要什么样的结果。有一种方法是:
df.groupby('three').apply(lambda grp: pd.Series(grp['two'].shift(-1) - grp['two']))
这样做的结果会是:
two a b
three
2 1 NaN
3 1 NaN
经过这个操作后,列的名称会变得有点没意义。