pandas将数据透视表与DataFrame结合起来

时间:2016-06-23 12:48:17

标签: python pandas dataframe group-by pivot-table

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

这是我的数据集:

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'发生了')

似乎我不理解applymap。

我想要实现的目标是:

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

1 个答案:

答案 0 :(得分:0)

您可以先从pivot_table中的参数中删除[],然后从列中删除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投放到str并输出到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