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
我试过以下方法:
- 选项-1:
df.explode('tags')
- 选项 2:
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 |
很抱歉重复之前回答过的相同问题,但他们似乎没有给我想要的结果,也许我错过了什么。
我有一个 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
我试过以下方法:
- 选项-1:
df.explode('tags')
- 选项 2:
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 |