这个DataFrame
有两列,都是对象类型。
Dependents Married
0 0 No
1 1 Yes
2 0 Yes
3 0 Yes
4 0 No
我想根据'已婚'汇总'家属'。
table = df.pivot_table(
values='Dependents',
index='Married',
aggfunc = lambda x: x.map({'0':0,'1':1,'2':2,'3':3}).mean())
然而,令人惊讶的是,以下情况并非如此:
table = df.pivot_table(values = 'Dependents',
index = 'Married',
aggfunc = lambda x: x.map(int).mean())
它将生成None
。
任何人都可以帮忙解释一下吗?
答案 0 :(得分:2)
您的问题中提供的两个代码示例都有效。然而,它们并不是实现你想要做的事情的惯用方式 - 特别是第一个。
我认为这是获得预期行为的正确方法。
# Test data
df = DataFrame({'Dependents': ['0', '1', '0', '0', '0'],
'Married': ['No', 'Yes', 'Yes', 'Yes', 'No']})
# Converting object to int
df['Dependents'] = df['Dependents'].astype(int)
# Computing the mean by group
df.groupby('Married').mean()
Dependents
Married
No 0.00
Yes 0.33
但是,以下代码有效。
df.pivot_table(values = 'Dependents', index = 'Married',
aggfunc = lambda x: x.map(int).mean())
在转换数据之前,使用int
转换为map
是等效的(并且更具可读性)。
df['Dependents'] = df['Dependents'].map(int)
df.pivot_table(values = 'Dependents', index = 'Married')
我有凌乱的DataFrame
,您可以to_numeric
使用error
参数设置为coerce
。
如果
coerce
,则无效的解析将设置为NaN
# Test data
df = DataFrame({'Dependents': ['0', '1', '2', '3+', 'NaN'],
'Married': ['No', 'Yes', 'Yes', 'Yes', 'No']})
df['Dependents'] = pd.to_numeric(df['Dependents'], errors='coerce')
print(df)
Dependents Married
0 0.0 No
1 1.0 Yes
2 2.0 Yes
3 NaN Yes
4 NaN No
print(df.groupby('Married').mean())
Dependents
Married
No 0.0
Yes 1.5
答案 1 :(得分:0)
我最初的问题是为什么使用map(int)的方法2无法正常工作。以上都不回答我的问题。因此,没有最佳答案。
但是,当我回头看时,我现在在pandas 0.22中发现了方法2确实有效。我想问题出在大熊猫上。
要稳健地进行汇总,我的解决方案是
df.pivot_table(
values='Dependents',
index='Married',
aggfunc = lambda x: x.map(lambda x:int(x.strip("+"))).mean())
为了使它更整洁,我想您可以先将“从属”列转换为整数,然后进行聚合。