繁体   English   中英

大熊猫将数据透视表与DataFrame相结合

[英]pandas combine pivot table with DataFrame

我想对我的数据集进行分组,并用汇总信息的格式表示来丰富它。

这是我的数据集:

h = ['A', 'B', 'C']
d = [["a", "x", 1], ["a", "y", 2], ["b", "y", 4]] 
rows = pd.DataFrame(d, columns=h)

   A  B  C
0  a  x  1
1  a  y  2
2  b  y  4

我创建一个数据透视表来为缺失值生成0

pivot = pd.pivot_table(rows,index=["A"], values=["C"], columns=["B"],fill_value=0)

   C   
B  x  y
A      
a  1  2
b  0  4

我按A分组以删除尺寸B

wanted = rows.groupby("A").sum()

   C
A   
a  3
b  4

我尝试用汇总详细信息的字符串表示形式添加一列:

wanted["D"] = pivot["C"].applymap(lambda vs: reduce(lambda a,b: str(a)+"+"+str(b), vs.values))

AttributeError :(“ int对象没有属性'values'”,在索引x'处出现u)

看来我听不懂applymap。

我想要实现的是:

   C  D
A   
a  3  1+2
b  4  0+4

您可以先从pivot_table参数中删除[]Multiindex从各列中删除Multiindex

pivot = pd.pivot_table(rows,index="A", values="C", columns="B",fill_value=0)

然后按列对值sum

pivot['C'] = pivot.sum(axis=1)
print (pivot)
B  x  y  C
A         
a  1  2  3
b  0  4  4

astype intxy astypestr并输出到D

pivot['D'] = pivot['x'].astype(str) + '+' + pivot['y'].astype(str)
print (pivot)
B  x  y  C    D
A              
a  1  2  3  1+2
b  0  4  4  0+4

最后通过rename_axispandas 0.18.0新功能)删除列名称,并drop不必要的列:

pivot = pivot.rename_axis(None, axis=1).drop(['x', 'y'], axis=1)
print (pivot)
   C    D
A        
a  3  1+2
b  4  0+4

但是如果要在列中使用Multiindex

pivot = pd.pivot_table(rows,index=["A"], values=["C"], columns=["B"],fill_value=0)

pivot['E'] = pivot["C"].sum(1)
print (pivot)
   C     E
B  x  y   
A         
a  1  2  3
b  0  4  4

pivot["D"] = pivot[('C','x')].astype(str) + '+' + pivot[('C','y')].astype(str)
print (pivot)
   C     E    D
B  x  y        
A              
a  1  2  3  1+2
b  0  4  4  0+4

pivot = pivot.rename_axis((None,None), axis=1).drop('C', axis=1).rename(columns={'E':'C'})
pivot.columns = pivot.columns.droplevel(-1)
print (pivot)
   C    D
A        
a  3  1+2
b  4  0+4

编辑:

groupbyMultiIndex.droplevel另一个解决方案:

pivot = pd.pivot_table(rows,index=["A"], values=["C"], columns=["B"],fill_value=0)

#remove top level of Multiindex in columns
pivot.columns = pivot.columns.droplevel(0)
print (pivot)
B  x  y
A      
a  1  2
b  0  4

wanted = rows.groupby("A").sum()
wanted['D'] = pivot['x'].astype(str) + '+' + pivot['y'].astype(str)
print (wanted)
   C    D
A        
a  3  1+2
b  4  0+4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM