因此,我想对某些列进行分组,对于大小大于1的每个组,取其余列的均值(如果所有值均为nan,则应为nan;否则,我希望将nans落在均值中计算,这是默认行为)。然后我要删除多余的行。下面的代码可以做到这一点:
import pandas as pd
import numpy as np
df = pd.DataFrame(
[[1, np.nan, 100, 63], [2, np.nan, 101, 63], [2, 12, 102, 63],
[2, 14, 102, 63], [2, 14, 102, 64], [1, np.nan, 200, 63]],
columns=['group', 'value', 'value2', 'dummy'])
print(df)
df = df.set_index(['group', 'dummy'])
groupby = df.groupby(['group', 'dummy'])
idx = groupby.size() > 1
df_groups_to_process = df.loc[idx]
# the code below would calculate the mean for all groups, huge performance hit
# df.loc[idx, ['value', 'value2']] = \
# groupby[['value', 'value2']].transform('mean')[idx].values
df.loc[idx, ['value', 'value2']] = \
df_groups_to_process.groupby(['group', 'dummy'])[
['value', 'value2']].transform('mean').values
print(df)
df = df.groupby(['group', 'dummy']).first()
print(df)
打印:
group value value2 dummy
0 1 NaN 100 63
1 2 NaN 101 63
2 2 12.0 102 63
3 2 14.0 102 63
4 2 14.0 102 64
5 1 NaN 200 63
sys:1: PerformanceWarning: indexing past lexsort depth may impact performance.
value value2
group dummy
1 63 NaN 150.000000
2 63 13.0 101.666667
63 13.0 101.666667
63 13.0 101.666667
64 14.0 102.000000
1 63 NaN 150.000000
value value2
group dummy
1 63 NaN 150.000000
2 63 13.0 101.666667
64 14.0 102.000000
Process finished with exit code 0
但是,有一些可以改进的地方:
df_groups_to_process = df.loc[idx]
不确定是否会创建一个副本,但是由于我的真实数据非常庞大,我希望完全避免这种情况,并将其合并到df.loc[idx, ['value', 'value2']] = ...
行中sys:1: PerformanceWarning: indexing past lexsort depth may impact performance.
-不知道这是什么意思(我实际上在服务器上看不到)。我该如何纠正?答案 0 :(得分:1)
一个值的平均值就是值本身,因此,除非我缺少某些内容,否则无需按组大小进行区分。
考虑
>>> df
group value value2 dummy
0 1 NaN 100 63
1 2 NaN 101 63
2 2 12.0 102 63
3 2 14.0 102 63
4 2 14.0 102 64
5 1 NaN 200 63
>>>
>>> df.groupby(['group', 'dummy']).mean()
value value2
group dummy
1 63 NaN 150.000000
2 63 13.0 101.666667
64 14.0 102.000000
这看起来像您的预期输出。如果这样可以解决您可能正在考虑的所有输入数据框的问题,请发表评论。