不同列上的不同差异操作
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 具有与原始列相同大小的系列 diff
或 cumsum
是可能的使用 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
我想对 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 具有与原始列相同大小的系列 diff
或 cumsum
是可能的使用 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