这个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
。
谁能帮忙解释一下?
您的问题中提供的两个代码示例都有效。然而,它们并不是实现你想要做的事情的惯用方式 - 特别是第一个。
我认为这是获得预期行为的正确方法。
# 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
我最初的问题是使用map(int)的方法2不起作用的原因。以上都没有回答我的问题。因此没有最佳答案。
然而,当我回顾过去,我现在发现大熊猫0.22,方法2确实有效。我想问题出在熊猫身上。
为了有力地进行聚合,我的解决方案就是
df.pivot_table(
values='Dependents',
index='Married',
aggfunc = lambda x: x.map(lambda x:int(x.strip("+"))).mean())
为了使它更干净,我想你可以先将“Dependents”列翻译成整数然后进行聚合。