在熊猫中使用groupby-apply时,输出的索引似乎取决于apply函数返回pd.DataFrame
还是pd.Series
。理想情况下,我希望我的apply函数返回一个pd.DataFrame
,并且apply的结果是一个多索引,当结果为pd.Series
时,是否有办法实现? / p>
一个最小的例子:
import numpy as np
import pandas as pd
data = np.array([np.random.randint(1, 3, 10, dtype=int),
np.random.randint(1, 4, 10, dtype=int),
np.random.random(10),
np.random.random(10)]).T
df = pd.DataFrame(data=data, columns=['A', 'B', 'x', 'y'])
grouped = df.groupby(['A', 'B'])
print(grouped.apply(lambda g: g['x'].diff()))
print(grouped.apply(lambda g: g[['x', 'y']].diff()))
输出:
A B
1.0 1.0 5 NaN
8 -0.093603
2.0 1 NaN
3.0 2 NaN
9 -0.399529
2.0 1.0 3 NaN
2.0 0 NaN
7 -0.510983
3.0 4 NaN
6 0.175588
Name: x, dtype: float64
x y
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 0.175588 0.155579
7 -0.510983 0.483819
8 -0.093603 0.465513
9 -0.399529 -0.203326
我可以考虑一些解决方法,但是我希望听到一些方法来告诉应用程序维护索引。
编辑:一种解决方法可能并不像我想的那样糟糕:
pd.concat([grouped.apply(lambda g: g[col].diff()) for col in ['x', 'y']], axis=1)