例子
import pandas as pd
import numpy as np
d = {'l': ['left', 'right', 'left', 'right', 'left', 'right'],
'r': ['right', 'left', 'right', 'left', 'right', 'left'],
'v': [-1, 1, -1, 1, -1, np.nan]}
df = pd.DataFrame(d)
问题
当分组的数据框中包含np.NaN
时,我希望按组求和的结果为NaN
,就像pd.Series.sum
和pd.DataFrame.sum
中的skipna=False
标志所示一样,然而,这个
In [235]: df.v.sum(skipna=False)
Out[235]: nan
然而,这种行为在
pandas.DataFrame.groupby
对象中并没有体现。In [237]: df.groupby('l')['v'].sum()['right']
Out[237]: 2.0
不能直接使用np.sum
方法来强制执行该操作。
In [238]: df.groupby('l')['v'].apply(np.sum)['right']
Out[238]: 2.0
解决方法
我可以通过做以下操作来解决这个问题
check_cols = ['v']
df['flag'] = df[check_cols].isnull().any(axis=1)
df.groupby('l')['v', 'flag'].apply(np.sum).apply(
lambda x: x if not x.flag else np.nan,
axis=1
)
但这很丑陋。有更好的方法吗?
.apply(pd.DataFrame.sum, skipna=False)
。 - Alexander McFarlane