pandas 行列转换


针对pandas数据行列转换问题分类及解决方法,参考原博客,其作者写的非常好,忍不住点赞--(https://www.cnblogs.com/traditional/p/11967360.html),在总结一下,方便使用。

1. 行转列

原数据

转换后

      解决方法:方法1)pd.pivot(df, index="姓名", columns="科目", values="分数")

               方法2) # 将"姓名"和"科目"设置为索引, 然后取出"分数"这一列, 得到的对应的具有二级索引的Series对象
                  two_level_index_series = df.set_index(["姓名", "科目"])["分数"]
                 # 调用具有二级索引的Series的unstack, 会得到一个DataFrame
                 # 并会自动把一级索引变成DataFrame的索引, 二级索引变成DataFrame的列
                 new_df = two_level_index_series.unstack()

2. 一行变多行

原数据

转换后

   解决方法:方法1)# 此时不需要指定expand=True了, 这里我们需要的是一个列表
            df["声优"] = df["声优"].str.split(",")
                0    琪亚娜·卡斯兰娜   12月7日                        [陶典, 钉宫理惠]
            df = df.explode("声优")
                       姓名        生日           声优
               0    琪亚娜·卡斯兰娜  12月7日          陶典
               0    琪亚娜·卡斯兰娜  12月7日        钉宫理惠
            方法2)df.set_index(["姓名", "生日"])["声优"].str.split(",", expand=True)\
          .stack().reset_index(drop=True, level=-1).reset_index().rename(columns={0: "声优"})

3.列转行

原数据

转换后

   解决方法:方法1)pd.melt(df, id_vars=["姓名", "水果"],
                    value_vars=["星期一", "星期二", "星期三"],
                    var_name="星期几?",
                    value_name="销量")
             参数说明:frame: 第一个参数, 接收一个DataFrame, 这没有什么好说的
                      id_vars: 第二个参数, 不需要进行列转行的字段, 比如这里的"姓名"和"水果", 在列转行之后会自动进行匹配
                      value_vars: 第三个参数, 需要进行列转行的字段
                      var_name: 第四个参数, 我们说列转行之后会生成两个列, 第一个列存储的值是"列转行之前的列的列名",第二个 
                                列存储的值是"列转行之前的列的值"。但是生成的两个列总要有列名吧,所以var_name就是生成的第一 
                                个列的列名
                      value_name: 生成的第二个列的列名
                      col_level: 针对于具有二级列名的DataFrame, 这个一般可以不用管 

4. 根据字典拆分多列

import pandas as pd

df = pd.DataFrame({"id": ["001", "002", "003"],
                   "info": [{"姓名": "琪亚娜·卡斯兰娜", "生日": "12月7日", "外号": "草履虫"},
                            {"姓名": "布洛妮娅·扎伊切克", "生日": "8月18日", "外号": "板鸭"},
                            {"姓名": "德丽莎·阿波卡利斯", "生日": "3月28日", "外号": "德丽傻", "武器": "犹大的誓约"}]
                  })

# 筛选出"info"这一列, 然后使用apply, 里面是一个pd.Series
tmp = df["info"].apply(pd.Series)
# 打印一看, 神奇的事情发生了, 直接就变成了我们想要的结果
print(tmp)
"""
          姓名        生日   外号     武器
0   琪亚娜·卡斯兰娜  12月7日  草履虫    NaN
1  布洛妮娅·扎伊切克  8月18日   板鸭    NaN
2  德丽莎·阿波卡利斯  3月28日  德丽傻  犹大的誓约
"""
# 因为我们这里的值是一个字典, 而Series接收一个字典的话, 那么字典的key就是索引, value就是值
# 在扩展成DataFrame的时候同样会考虑到字典中所有的key, 有多少个不重复的key就会生成多少个列
# 如果该行没有对应的值则使用NaN填充

# 然后就简单了, 将tmp添加到df中
df[tmp.columns] = tmp

# 然后删掉"info"这一列
df = df.drop(columns=["info"])

print(df)
"""
    id         姓名       生日     外号     武器
0  001   琪亚娜·卡斯兰娜  12月7日   草履虫    NaN
1  002  布洛妮娅·扎伊切克  8月18日   板鸭     NaN
2  003  德丽莎·阿波卡利斯  3月28日  德丽傻  犹大的誓约
"""

5.多列转两列

原数据

转换后

解决方法


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM