我有一些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],因为这是两个'中的每一行之间的差异。柱
这在我的原始代码的上下文中更有意义 - 我的数据框由一些ID组织,然后按时间组织,当我通过ID获取数据框的子集时,我留下了每个个体ID的变量的时间序列演变。但是,我继续接收键错误,或者尝试编辑原始数据帧的副本。什么是正确的方法?
答案 0 :(得分:0)
您可以在第3列上将df[df['three'] == i]
替换为groupby
。也许用['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
此操作后,列名称变得毫无意义。
答案 1 :(得分:0)
如果你想要做的就是获得第二列的行之间的区别,你可以使用shift方法。
df['four'] = df.two.shift(-1) - df.two