我是第一次使用 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
将变为 NaN
,True
变为 1
,False
变为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/