pandas pivot table aggfunc故障排除

问题描述 投票:0回答:2

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

谁能帮忙解释一下?

python pandas pivot-table
2个回答
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')

Edit

我你有混乱的DataFrame,你可以使用to_numericerror参数设置为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

0
投票

我最初的问题是使用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”列翻译成整数然后进行聚合。

© www.soinside.com 2019 - 2024. All rights reserved.