Python 基于另一列的值向数据帧添加列
我有一些pandas数据框,我想添加一个列,它是一个列的差异,基于第三列的值。以下是一个玩具示例:Python 基于另一列的值向数据帧添加列,python,pandas,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
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的变量的时间序列演变。但是,我不断收到一个关键错误,或试图编辑原始数据帧的副本。正确的方法是什么?您可以用第三列的groupby替换df[df['three']==i]。或者用df['two']替换['two'][j+1]-['two'][j]
我认为这与您现在在嵌套循环中所做的相同。这在一定程度上取决于您想要什么格式,以及如何实现它。一种方法是:
df.groupby('three').apply(lambda grp: pd.Series(grp['two'].shift(-1) - grp['two']))
这将导致:
two a b
three
2 1 NaN
3 1 NaN
执行此操作后,列名称变得有点无意义。如果您只想获得第二列的行之间的差异,请使用此方法
您想要什么输出?目前它只是一个列表…如果你真的想要另一列,你能至少显示一行的最后一列应该是什么样子吗?是的,我继续编辑了我的答案,希望现在更清楚。谢谢你的回复!然而,这并不是我想要做的——我已经编辑了我的回复,希望它现在更清晰。在操作之后,我仍然希望在原始数据框中保持相同的行数和列数。我显然误解了,您是否可以修复您的示例,使其工作并符合您的文本。现在循环总共运行六次,外部两次,内部三次,在循环外部追加一次。这将如何给出一个长度为4的列表?是的,这就是问题所在,我找不到一个有效的例子。这个例子是我认为应该做的事情和我试图做的事情的最佳近似,但最终,我不知道如何生成我想要生成的输出。
df['four'] = df.two.shift(-1) - df.two