簡體   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