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