根据另一列的值将列添加到python pandas数据框中

时间:2014-08-26 15:01:30

标签: 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],因为这是两个'中的每一行之间的差异。柱

这在我的原始代码的上下文中更有意义 - 我的数据框由一些ID组织,然后按时间组织,当我通过ID获取数据框的子集时,我留下了每个个体ID的变量的时间序列演变。但是,我继续接收键错误,或者尝试编辑原始数据帧的副本。什么是正确的方法?

2 个答案:

答案 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