我的数据框有很多列,其中2个是分类的,其余的是数字:
df = [type1 , type2 , type3 , val1, val2, val3
a b q 1 2 3
a c w 3 5 2
b c t 2 9 0
a b p 4 6 7
a c m 2 1 8]
我想基于操作groupby(["type1","type2"])
应用合并,该合并将创建以下数据框:
df = [type1 , type2 ,type3, val1, val2, val3 , val1_a, val2_b, val3_b
a b q 1 2 3 4 6 7
a c w 3 5 2 2 1 8
b c t 2 9 0 2 9 0
请注意:每个分组依据可以有1或2行,但不能更多。如果是1,则只需复制单行
答案 0 :(得分:2)
想法由type1, type2
使用GroupBy.cumcount
进行计数器,然后创建MultiIndex
,由DataFrame.unstack
整形,由ffill
前行填充每行的缺失值,转换为整数,按计数器级别排序,最后进入列表理解范围MultiIndex
:
g = df.groupby(["type1","type2"]).cumcount()
df1 = (df.set_index(["type1","type2", g])
.unstack()
.ffill(axis=1)
.astype(int)
.sort_index(level=1, axis=1))
df1.columns = [f'{a}_{b}' if b != 0 else a for a, b in df1.columns]
df1 = df1.reset_index()
print (df1)
type1 type2 val1 val2 val3 val1_1 val2_1 val3_1
0 a b 1 2 3 4 6 7
1 a c 3 5 2 2 1 8
2 b c 2 9 0 2 9 0