Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于另一列的值向数据帧添加列_Python_Pandas - Fatal编程技术网

Python 基于另一列的值向数据帧添加列

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

我有一些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的变量的时间序列演变。但是,我不断收到一个关键错误,或试图编辑原始数据帧的副本。正确的方法是什么?

您可以用第三列的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