我有这样的熊猫数据框:
name code code2 region
A 1 2 5
B 3 4 5
C 5 6 6
A 7 8 5
我需要按名称和地区对数据进行分组吗?然后将两个代码都保存在一列中,因此输出将类似于:
name codes region
A [1, 2], [7, 8] 5
B [3, 4] 5
C [5, 6] 6
我想到了这个
df['codes'] = df.apply(lambda x: list(np.append(x['code'], x['code2'])), axis=1)
df = df.groupby(['name', 'region'])
但是在“ groupby”之后,我无法使用df,并且不知道该如何继续?
答案 0 :(得分:1)
尝试pd.melt
和unstack
df1 = pd.melt(df, id_vars=["name", "region"]).groupby(["name", "region", "variable"])[
"value"
].agg(list).unstack(-1).agg(list,axis=1).to_frame('codes')
print(df1)
codes
name region
A 5 [[1, 7], [2, 8]]
B 5 [[3], [4]]
C 6 [[5], [6]]
不推荐,但是如果您想要目标输出,则必须将列表转换为字符串。
df_str = pd.melt(df, id_vars=["name", "region"]).groupby(["name", "region", "variable"])[
"value"
].agg(list).unstack(-1).astype(str).agg(','.join,axis=1).to_frame('codes')
print(df_str)
codes
name region
A 5 [1, 7],[2, 8]
B 5 [3],[4]
C 6 [5],[6]
或更简单的解决方案:
注释级别1-0指的是您设置的索引-名称和区域。
df.set_index(['name', 'region']).agg(list, axis=1).groupby(level=[0,1]).agg(list)
name region
A 5 [[1, 2], [7, 8]]
B 5 [[3, 4]]
C 6 [[5, 6]]