大佬教程收集整理的这篇文章主要介绍了根据 Pandas 中的前缀将多列熔化为对应的列,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设有以下数据框:
ID transaction seller0 seller1 seller2 buyer0 buyer1
0 1 Subject1 Tim JamIE Melissa RosIE NaN
1 2 Subject2 Rima Derren NaN Annalise Hania
2 3 Subject3 Rosa NaN NaN Joshua NaN
我怎样才能将它改造成以下格式?即,seller0 seller1 seller2
到 seller
和 buyer0 buyer1
到 buyer
列对于每笔交易。
所需的输出:
ID transaction seller buyer
0 1 Subject1 Tim RosIE
1 1 Subject1 JamIE NaN
2 1 Subject1 Melissa NaN
3 2 Subject2 Rima Annalise
4 2 Subject2 Derren Hania
5 3 Subject3 Rosa Joshua
df.melt(['ID','transaction'],value_name = 'seller').drop('variable',1)
出:
ID transaction seller
0 1 Subject1 Tim
1 2 Subject2 Rima
2 3 Subject3 Rosa
3 1 Subject1 JamIE
4 2 Subject2 Derren
5 3 Subject3 NaN
6 1 Subject1 Melissa
7 2 Subject2 NaN
8 3 Subject3 NaN
9 1 Subject1 RosIE
10 2 Subject2 Annalise
11 3 Subject3 Joshua
12 1 Subject1 NaN
13 2 Subject2 Hania
14 3 Subject3 NaN
所需的更新输出:
ID transaction type name
0 1 Subject1 seller Tim
1 1 Subject1 seller JamIE
2 1 Subject1 seller Melissa
3 2 Subject2 seller Rima
4 2 Subject2 seller Derren
5 3 Subject3 seller Rosa
6 1 Subject1 buyer RosIE
7 2 Subject2 buyer Annalise
8 2 Subject2 buyer Hania
9 3 Subject3 buyer Joshua
使用wide_to_long
(
pd.wide_to_long(df,stubnames=["seller","buyer"],i=["id","transaction"],j="num")
.dropna(how="all")
.droplevel(level=-1)
.reset_index()
)
id transaction seller buyer
0 1 Subject1 Tim Rosie
1 1 Subject1 Jamie NaN
2 1 Subject1 Melissa NaN
3 2 Subject2 Rima Annalise
4 2 Subject2 Derren Hania
5 3 Subject3 Rosa Joshua
您也可以使用 pivot_longer 中的 pyjanitor 函数;目前您必须从 github:
安装最新的开发版本 # install latest dev version
# pip install git+https://github.com/ericmjl/pyjanitor.git
import janitor
(
df.pivot_longer(index=["id",names_to=".value",names_pattern=r"([a-z]+)\d")
.dropna(subset=["seller",how="all")
)
id transaction seller buyer
0 1 Subject1 Tim Rosie
1 2 Subject2 Rima Annalise
2 3 Subject3 Rosa Joshua
3 1 Subject1 Jamie NaN
4 2 Subject2 Derren Hania
6 1 Subject1 Melissa NaN
更新:
对于更新后的结果,您可以叠加并做一些小的调整:
(
df.set_index(["id","transaction"])
.stack()
.rename_axis(["id","transaction","type"])
.reset_index(name="name")
.assign(type=lambda df: df["type"].str[:-1])
)
id transaction type name
0 1 Subject1 seller Tim
1 1 Subject1 seller Jamie
2 1 Subject1 seller Melissa
3 1 Subject1 buyer Rosie
4 2 Subject2 seller Rima
5 2 Subject2 seller Derren
6 2 Subject2 buyer Annalise
7 2 Subject2 buyer Hania
8 3 Subject3 seller Rosa
9 3 Subject3 buyer Joshua
你也可以使用pivot_longer:
result = df.pivot_longer(index=["id",names_to="type",names_pattern=r"([a-z]+)\d",values_to="name").dropna()
result
id transaction type name
0 1 Subject1 seller Tim
1 2 Subject2 seller Rima
2 3 Subject3 seller Rosa
3 1 Subject1 seller Jamie
4 2 Subject2 seller Derren
6 1 Subject1 seller Melissa
9 1 Subject1 buyer Rosie
10 2 Subject2 buyer Annalise
11 3 Subject3 buyer Joshua
13 2 Subject2 buyer Hania
在这两种情况下,您都试图完全摆脱空条目。默认情况下,堆栈会删除空条目。
以上是大佬教程为你收集整理的根据 Pandas 中的前缀将多列熔化为对应的列全部内容,希望文章能够帮你解决根据 Pandas 中的前缀将多列熔化为对应的列所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。