Python 熊猫透视表aggfunc故障排除

Python 熊猫透视表aggfunc故障排除,python,pandas,pivot-table,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',

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())
它与在数据透视之前使用
map
转换为
int
等效(且可读性更高)

df['Dependents'] = df['Dependents'].map(int)
df.pivot_table(values = 'Dependents', index = 'Married')
编辑 如果您有凌乱的
数据帧
,您可以使用
来对
错误
参数设置为
强制

如果
强制
,则无效解析将设置为
NaN


问题中提供的两个代码示例都很有用。然而,它们并不是实现你想要做的事情的惯用方法——尤其是第一种

我认为这是获得预期行为的正确方法

# 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())
它与在数据透视之前使用
map
转换为
int
等效(且可读性更高)

df['Dependents'] = df['Dependents'].map(int)
df.pivot_table(values = 'Dependents', index = 'Married')
编辑 如果您有凌乱的
数据帧
,您可以使用
来对
错误
参数设置为
强制

如果
强制
,则无效解析将设置为
NaN


我最初的问题是为什么使用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())

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

我最初的问题是为什么使用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())


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

看起来第二组中的lambda缺少一组括号。另外,为什么不直接使用aggfunc=int?在导入或预处理时不将整个内容转换为整数有什么原因吗
df=pd.read\u csv('bleh.csv')。assign(Dependents=lambda d:d.Dependents.astype(“int”)
或类似方法?@Sohier-Dane。我不认为lambda函数中遗漏了()。我试着把一个pd序列,如果str映射成int,然后得到它的平均值。我需要知道已婚家庭与单身家庭的平均抚养人数。对转换为int会更简单。但是数据不是干净的,“Dependents”列具有“3+”、“3+”和“NaN”等值,在转换之前需要进行一些预处理。事实上,现在我认为第一种方法似乎很麻烦,但它对于处理除“1”、“2”、“3”和“0”以外的意外值很健壮。@user2951327 FWIW,我认为如果数据脏了,在pivot的
aggfunc
中清理数据是最不简单的方法之一。为什么不先把它清理干净,然后再做枢轴呢?它更容易看到发生了什么,还允许您执行除旋转以外的其他操作。看起来您缺少了第二组lambda周围的一组括号。另外,为什么不直接使用aggfunc=int?在导入或预处理时不将整个内容转换为整数有什么原因吗
df=pd.read\u csv('bleh.csv')。assign(Dependents=lambda d:d.Dependents.astype(“int”)
或类似方法?@Sohier-Dane。我不认为lambda函数中遗漏了()。我试着把一个pd序列,如果str映射成int,然后得到它的平均值。我需要知道已婚家庭与单身家庭的平均抚养人数。对转换为int会更简单。但是数据不是干净的,“Dependents”列具有“3+”、“3+”和“NaN”等值,在转换之前需要进行一些预处理。事实上,现在我认为第一种方法似乎很麻烦,但它对于处理除“1”、“2”、“3”和“0”以外的意外值很健壮。@user2951327 FWIW,我认为如果数据脏了,在pivot的
aggfunc
中清理数据是最不简单的方法之一。为什么不先把它清理干净,然后再做枢轴呢?它更容易看到正在发生的事情,还允许您执行旋转以外的其他操作。是的。我同意它更干净。但我不知道为什么它不起作用。也许还有其他原因。我可以关闭此IssueGraat,因此您可以检查答案。您的方法可能无法处理杂乱的数据,例如,使用df=DataFrame({'Dependents':['0','1','2','3+','NaN'],'marred':['No','Yes','Yes','Yes','No']),astype(int)无法工作。若要将'3+'转换为NaN,这可能不是您想要的,'df=df.apply(lambda x:x.map({'0':0,'1':1,'2':2,'3':3})是混乱的,但可以接受。@FrankZhu感谢您的评论(以及否决票)。请发布您的最佳答案,如果它运行良好,我将很高兴投票支持。请参阅上面的我的答案@Romainyes。我同意它更干净。但我不知道为什么它不起作用。可能还有其他原因。我可以关闭此问题,因此您可以检查答案。您的方法可能无法处理凌乱的数据,例如,使用df=DataFrame({'Dependents':['0','1','2','3+','NaN'],'marted':['No','Yes','Yes','Yes','No']}),astype(int)不起作用。to_numeric会将'3+'翻译成NaN,这可能不是您想要的,'df'