根据另一列的值向Python pandas数据框添加列

0 投票
2 回答
821 浏览
提问于 2025-04-18 18:35

我有一个 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

经过这个操作后,列的名称会变得有点没意义。

撰写回答