python - 汇总分组 Pandas 数据框中的行并返回 NaN

标签 python pandas numpy dataframe nan

例子

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,如 skipna=False pd.Series.sum 的标志还有pd.DataFrame.sum然而,这

In [235]: df.v.sum(skipna=False)
Out[235]: nan

但是,此行为并未反射(reflect)在 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
)

但这很丑陋。有没有更好的方法?

最佳答案

我认为这是 pandas 固有的。解决方法可以是:

df.groupby('l')['v'].apply(array).apply(sum)

模仿 numpy 的方式,

df.groupby('l')['v'].apply(pd.Series.sum,skipna=False) # for series, or
df.groupby('l')['v'].apply(pd.DataFrame.sum,skipna=False) # for dataframes.

调用好的函数。

关于python - 汇总分组 Pandas 数据框中的行并返回 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42770300/

相关文章:

python - Tastypie 将登录用户识别为 AnonymousUser

python - 哪些类不能被子类化?

python - 通过转换为PNG使JPEG图像中的背景透明

python - 从 numpy 数组创建字符串列表(非循环解决方案)

python - 是否可以在pygame中使用简单的旋转矩阵来模拟圆形轨道?

python - 在列表中查找连续数字的序列

python - 根据 Pandas 的开始日期按组检查所有条件是否为真

pandas - Python Pandas:从多级列索引中删除一列?

python - 将不同列的分类数据合并到一列中

python - 如何在 seaborn fiddle 情节中为每个组分配不同的位置