pandas 如何根据列名转换数据

m4pnthwp  于 2023-05-15  发布在  其他
关注(0)|答案(2)|浏览(111)

我正在尝试转换我的df,其中一些列名以宽到长的形式融合。
我的df看起来像这样:

id, university, # CA Holiday, # CA Hours, # WA Holiday, # WA Hours
1    abc              1           5           NA           3
2    def              5           NA           3           7
3    ijk              1           5           NA           3

在这里,

  • 我的钥匙是:[id, university]。钥匙没有熔化。
  • 输出变量:WA, CA。输出变量基本上是列的短格式,它被分解。

我的最终转换输出df是这样排列的。

id, university, Holiday_State, Holiday, Hours
1    abc          CA           1         5
1    abc          WA          NA         3 
2    def          CA           5         NA
2    def          WA           3         7    
3    ijk          CA           1         5
3    ijk          WA          NA         3

有人能提供帮助来解决这个问题吗?

j13ufse2

j13ufse21#

一个选项是交换 * 前缀/后缀 *,以便为wide_to_long整形创建 stubnames

out = (df.set_index(["id", "university"])
         .pipe(lambda x: x.set_axis([f"{c2}_{c1}"
               for _,c1,c2 in x.columns.str.split(r"\s|_")], axis=1)).reset_index()
         .pipe(pd.wide_to_long, stubnames=["Holiday", "Hours"],
                  i=["id", "university"], j="Holiday_State", sep="_", suffix=r"\w+")
         .reset_index()
      )

输出:

print(out)
           
   id university Holiday_State  Holiday  Hours
0   1        abc            CA     1.00   5.00
1   1        abc            WA      NaN   3.00
2   2        def            CA     5.00    NaN
3   2        def            WA     3.00   7.00
4   3        ijk            CA     1.00   5.00
5   3        ijk            WA      NaN   3.00
7fyelxc5

7fyelxc52#

一个选项是使用pivot_longer:

# pip install pyjanitor
import pandas as pd
import janitor

df.pivot_longer(index = ['id', 'university'], 
                names_to = ['Holiday_State', '.value'], 
                names_pattern = r".\s([a-zA-Z]+).(.+)",
                sort_by_appearance = True)
   id university Holiday_State  Holiday  Hours
0   1        abc            CA      1.0    5.0
1   1        abc            WA      NaN    3.0
2   2        def            CA      5.0    NaN
3   2        def            WA      3.0    7.0
4   3        ijk            CA      1.0    5.0
5   3        ijk            WA      NaN    3.0

相关问题