如何使用pandas聚合具有空值的布尔字段?

时间:2017-03-24 20:48:27

标签: python pandas aggregate

我第一次和熊猫一起工作,而且我在聚合方面遇到了一些问题。我有一个数据框,其中三个计算字段由apply语句添加,如下所示:

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

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

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

我尝试过这样的事情:

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

问题在于,因为True / False / None布尔值是"对象"类型,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()

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

有没有办法让每个列的平均值得到一个数据帧,忽略空值?

1 个答案:

答案 0 :(得分:1)

将它们转换为数字列。 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