将数据与熊猫结合

时间:2020-07-20 09:43:22

标签: python pandas dataframe pandas-groupby

我有这样的熊猫数据框:

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,并且不知道该如何继续?

1 个答案:

答案 0 :(得分:1)

尝试pd.meltunstack

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]]