我想对我的数据集进行分组,并使用聚合信息的格式化表示来丰富它。
这是我的数据集:
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
答案 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
int
列x
和y
投放到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_axis
(pandas
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
编辑:
groupby
和MultiIndex.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