首页 > 解决方案 > 如何为熊猫中的每个逗号分隔值创建一个新行

问题描述

我有一个这样的数据框:

text                     text2           category 
sfsd sgvv                sfsdfdf         abc,xyz
zydf sefs sdfsd          drdg            yyy
dfsd dsrgd dggr          dgd             xyz
eter vxg wfe             fs              abc
dfvf ertet               dggdss          abc,xyz,bbb

我想要这样的输出:

text                     text2           category 
sfsd sgvv                sfsdfdf         abc
sfsd sgvv                sfsdfdf         xyz
zydf sefs sdfsd          drdg            yyy
dfsd dsrgd dggr          dgd             xyz
eter vxg wfe             fs              abc
dfvf ertet               dggdss          abc
dfvf ertet               dggdss          xyz
dfvf ertet               dggdss          bbb

基本上为列中的每两个或多个类别创建一个新行category

我试过这个:

df1 = (df.assign(category = df['category'].str.split(','))
         .explode('category')
         .reset_index(drop=True))

但它似乎创造了比预期更多的行。在我原来的 df 中,我有很多列,而不仅仅是 text、text2、category。

我的原始数据框的屏幕截图。

这里category= NER_Category

在此处输入图像描述

这是代码的输出:

在此处输入图像描述

标签: pythonpandas

解决方案


这应该这样做:

(df.set_index(df.columns.drop('category',1).tolist())['category']
   .str.split(',', expand=True)
   .stack()
   .reset_index()
   .rename(columns={0:'category'})
   .loc[:, df.columns]
)

              text    text2 category
0        sfsd sgvv  sfsdfdf      abc
1        sfsd sgvv  sfsdfdf      xyz
2  zydf sefs sdfsd     drdg      yyy
3  dfsd dsrgd dggr      dgd      xyz
4     eter vxg wfe       fs      abc
5       dfvf ertet   dggdss      abc
6       dfvf ertet   dggdss      xyz
7       dfvf ertet   dggdss      bbb

推荐阅读