不同列上的不同差异操作

Different diff operations on different columns

我想对 pandas 数据帧中的不同列执行不同的 diff() 操作。下面是在 lambda 函数中使用 if 语句在 col1 上获取 diff(1) 和在 col2 上获取 diff(2) 的示例。

data = pd.DataFrame({'col1':[32,42,54,62,76,76,87,98,122,111,132,134,134,156],
                    'col2':[32,58,59,63,65,72,95,100,102,101,232,234,234,256]})

data.apply(lambda x: x.diff(1) if x.name=='col1' else x.diff(2))

我首先想到的是用字典的解决方案,类似于agg function。当有两个以上的列时,这会更容易。有没有人有一些方便的方法来对不同的列进行不同的 diff() 操作?

一个简单的选择是使用字典来保存句点:

periods = {'col1': 1, 'col2': 2}

data.apply(lambda c: c.diff(periods[c.name]))

输出:

    col1   col2
0    NaN    NaN
1   10.0    NaN
2   12.0   27.0
3    8.0    5.0
4   14.0    6.0
...

如果所有操作 return 具有与原始列相同大小的系列 diffcumsum 是可能的使用 DataFrame.agg:

df = data.agg({'col1':lambda x: x.diff(), 'col2':lambda x: x.diff(2)})
print (df)
    col1   col2
0    NaN    NaN
1   10.0    NaN
2   12.0   27.0
3    8.0    5.0
4   14.0    6.0
5    0.0    9.0
6   11.0   30.0
7   11.0   28.0
8   24.0    7.0
9  -11.0    1.0
10  21.0  130.0
11   2.0  133.0
12   0.0    2.0
13  22.0   22.0

df = data.agg({'col1':lambda x: x.diff(), 'col2':'mean'})
print (df)

ValueError: cannot perform both aggregation and transformation operations simultaneously