Python Dataframe 分解具有多个值的行

Python Dataframe Explode Rows with multiple values

很抱歉重复之前回答过的相同问题,但他们似乎没有给我想要的结果,也许我错过了什么。

我有一个 Stack Overflow 数据集的子集,如下所示:

**tags                          time**
c#,winforms                     35
html,css,internet-explorer-7    855
c#,conversion,j#                472
c#,datetime                     556
c#,.net,datetime,timespan       1
php,security                    3
mysql                           5
codeigniter,routes              4
c#,progressbar                  4
.net,ide,linux,mono             2

我想要如下输出:

**tags                  time**
c#                      35
winforms                35
html                    855
css                     855
internet-explorer-7     855
c#                      472
conversion              472
j#                      472
c#                      556
datetime                556
c#                      1
.net                    1
datetime                1
timespan                1
php                     3
security                3
mysql                   5
codeigniter             4
routes                  4
c#                      4
progressbar             4
.net                    2
ide                     2
linux                   2
mono                    2

我试过以下方法:

df.explode('tags')
df.set_index(['time']).tags.apply(pd.Series).stack().reset_index(name = 'tags').drop('level_1', axis = 1)

在这两种情况下,我得到的输出与我的数据帧相同而没有爆炸。 我在这里做错了什么?

来自 pandas 文档 pandas.DataFrame.explode

specify a non-empty list with each element be str or tuple

要使用 explode,您的 'tags' 列必须是列表类型。应用一个函数将以逗号分隔的字符串标记转换为列表,然后使用选项 1 df.explode('tags')

实际上,从您问题的第一个版本(未编辑)来看,我猜您需要的是使用 iterrows 对行进行循环。我想到的是以下内容(为了避免这个答案变得冗长,我只是复制了你的数据框的一部分):

import pandas as pd
dataframe = pd.DataFrame({"tags": ["#c,windoforms,css", "#c,datetime"], "time":[35,40]})
newTags = []
newTime = []
for index, row in dataframe.iterrows():
  for name in row["tags"].split(","):
    newTags.append(name)
    newTime.append(row["time"])
resultDataframe = pd.DataFrame({"tags": newTags, "time":newTime})
resultDataframe

输出

|    | tags       |   time |
|---:|:-----------|-------:|
|  0 | #c         |     35 |
|  1 | windoforms |     35 |
|  2 | css        |     35 |
|  3 | #c         |     40 |
|  4 | datetime   |     40 |