我有一个这样的数据框:
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
列中为每个两个或更多类别创建一个新行。
答案 0 :(得分:4)
将DataFrame.explode
与Series.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)
祝你有美好的一天!