針對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.多列轉兩列
原數據
轉換后
解決方法