如何为熊猫列中的每个逗号分隔值创建新行

时间:2020-01-08 06:52:09

标签: python pandas

我有一个这样的数据框:

text                   category 
sfsd sgvv              abc,xyz
zydf sefs sdfsd        yyy
dfsd dsrgd dggr        xyz
eter vxg wfe           abc
dfvf ertet             abc,xyz

我想要这样的输出:

text                   category 
sfsd sgvv              abc
sfsd sgvv              xyz
zydf sefs sdfsd        yyy
dfsd dsrgd dggr        xyz
eter vxg wfe           abc
dfvf ertet             abc
dfvf ertet             abc

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

4 个答案:

答案 0 :(得分:4)

DataFrame.explodeSeries.str.split({0.25}以上的熊猫)一起使用:

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

对于较早的熊猫版本,首先使用DataFrame.set_index而不使用分隔符列,然后使用Series.str.split并通过DataFrame.stack进行整形,最后使用DataFrame.reset_index-首先删除{ {1}},然后将索引转换为列:

MultiIndex

答案 1 :(得分:1)

链接到this question,为您的数据框尝试以下代码:

我们可以首先拆分列,将其展开,堆叠,然后将其重新连接到原始df,如下所示:

df.drop('category', axis=1).join(
  df['category'].str.split(',', expand=True).stack().reset_index(level=1,drop=True).rename('category'))

答案 2 :(得分:1)

对于较旧的版本,请尝试使用set_index + stack + str.split + unstack + reset_index

print(df.set_index('text')
      .stack()
      .str.split(', ', expand=True)
      .stack()
      .unstack(-2)
      .reset_index(-1, drop=True)
      .reset_index())

答案 3 :(得分:1)

下面将提供您需要的输出。假设df是您的数据集名称。

new_df_skel = dict()
new_df_skel['text'] = list()
new_df_skel['category'] = list()

for index,item in df.iterrows():
  item = dict(item)
  unref_cat = item['category']
  if "," in unref_cat:
    for strip in unref_cat.split(','):
      new_df_skel['category'].append(strip)
      new_df_skel['text'].append(item['text'])
  else:
    new_df_skel['category'].append(strip)
    new_df_skel['text'].append(unref_cat)

new_dataset = pd.DataFrame(new_df_skel)

祝你有美好的一天!