pandas pivot table aggfunc故障排除

时间:2016-09-23 15:41:54

标签: python pandas pivot-table

这个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

任何人都可以帮忙解释一下吗?

2 个答案:

答案 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())

为了使它更整洁,我想您可以先将“从属”列转换为整数,然后进行聚合。