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'