针对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.多列转两列
原数据
转换后
解决方法