python - 如何使用 pandas 聚合具有空值的 bool 字段?

标签 python pandas aggregate

我是第一次使用 pandas,我在聚合方面遇到了一些问题。我有一个数据框,其中包含三个计算字段,由这样的应用语句添加:

dataset['calculated_field'] = dataset.apply(
    lambda row: calculation_function(
        row['field1'],
        row['field2']
    ),
    axis = 1
)

计算字段是 bool 值,但有一个问题。它们可以包含空值。

我试图找到 bool 列的平均值,每个平均值忽略该列的空字段。

我试过这样的:

resultset = dataset.groupby(['grouping_field'])[['calculated_field','calculated_field_2','calculated_field_3']].mean()

问题在于,由于 True/False/None bool 值是“对象”类型,pandas 将列完全丢弃为 “nuisance” column.。 .

不过,我无法将该列转换为 bool 值,因为它会使空值变为“False”

我还尝试了长路径并为每个聚合创建了 3 个单独的数据帧,因此我可以删除空值并转换为 bool 值(可以聚合):

dataset_for_field1 = dataset.dropna(subset = ['calculated_field']).copy()
dataset_for_field1['calculated_field'] = dataset_for_field1['calculated_field'].astype('bool')

result_for_field1 = dataset_for_field1.groupby(['grouping_field'])['calculated_field'].mean()

这为我提供了我正在寻找的数据,但在三个单独的数据框中。

有没有一种方法可以让一个数据帧具有每列的平均值,忽略空值?

最佳答案

将它们转换为数字列。 None 将变为 NaNTrue 变为 1False 变为0。转换整个数据帧的一种便捷方法是使用 pd.to_numeric 并将 errors 参数设置为 ignore。这将使分组列单独存在,因为它会在继续时出错。

考虑数据框 df

df = pd.DataFrame(dict(
        gcol=list('aaaabbbb'),
        clc1=[True, False, True, None] * 2,
        clc2=[True, False, True, False] * 2,
        clc3=[True, True, True, True] * 2,
        clc4=[False, None, None, True]* 2
    ))

这是转换为数字的样子

df.apply(pd.to_numeric, errors='ignore')

   clc1   clc2  clc3  clc4 gcol
0   1.0   True  True   0.0    a
1   0.0  False  True   NaN    a
2   1.0   True  True   NaN    a
3   NaN  False  True   1.0    a
4   1.0   True  True   0.0    b
5   0.0  False  True   NaN    b
6   1.0   True  True   NaN    b
7   NaN  False  True   1.0    b

将它与后续的 groupby 一起使用应该可以得到你想要的东西。

df.apply(pd.to_numeric, errors='ignore').groupby('gcol').mean()

          clc1  clc2  clc3  clc4
gcol                            
a     0.666667   0.5   1.0   0.5
b     0.666667   0.5   1.0   0.5

关于python - 如何使用 pandas 聚合具有空值的 bool 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008892/

相关文章:

python - 使用 pandas to_gbq 读取数据在 Google BigQuery 中创建表时出现 400 错误

sql-server - SQL返回值占子类别的百分比

python - 聚合组产生 Pandas 数据框

sql - 在 Oracle 中按组旋转没有聚合函数或行到列

python - Numba 矢量化最大化所有处理器

python - Pandas 基于行的列总和

python - Django 分组依据变量

python - 使用热图居中表格

python - 在后台运行 python 代码

Python 正则表达式 : how to do a negative lookahead with a string which don't start immediately?