程序问答   发布时间:2022-05-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了根据 Pandas 中的前缀将多列熔化为对应的列大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决根据 Pandas 中的前缀将多列熔化为对应的列?

开发过程中遇到根据 Pandas 中的前缀将多列熔化为对应的列的问题如何解决?下面主要结合日常开发的经验,给出你关于根据 Pandas 中的前缀将多列熔化为对应的列的解决方法建议,希望对你解决根据 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 seller2sellerbuyer0 buyer1buyer 列对于每笔交易。

所需的输出:

   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,请注明来意。
标签:根据