Pandas實現列表分列與字典分列的三個實例

2021-02-19 數據森麟

這次我將分享三個實際案例,讓大家看看列表分列的一些實際應用。

首先,我們先導包並設置Pandas顯示參數:

import pandas as pd
pd.set_option("display.max_colwidth", 100)

正則提取並分列

需求:

讀取數據:

df = pd.read_excel("正則提取與分列.xlsm", usecols=[0])
df.head()

結果:

實現代碼:

result = df.copy()
result["tmp"] = result["補回原因"].str.findall("([\d.]+[到至][\d.]+)")
result = result.agg({"補回原因": lambda x: x, "tmp": pd.Series}).droplevel(0, axis=1)
result.head()

結果:

分步解析:

df["tmp"] = df["補回原因"].str.findall("([\d.]+[到至][\d.]+)")
df.head(5)

結果:

這步使用正則提取出每個日期字符串,[\d.]+表示連續的數字或.用於匹配時間字符串,兩個時間之間的連接字符可能是到或至。

然後我使用agg函數直接對Datafream分列:

df.agg({"補回原因": lambda x: x, "tmp": pd.Series})

結果:

由於列索引多了一級,所以需要刪除:

df.agg({"補回原因": lambda x: x, "tmp": pd.Series}).droplevel(0, axis=1).head()

結果:

droplevel(0, axis=1)用於刪除多級索引指定的級別,axis=0可以刪除行索引,axis=1則可以刪除列索引,第一參數表示刪除級別0。當然如果列索引存在名稱時還可以傳入名稱字符串,可參考官網文檔:

df = pd.DataFrame([
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12]
... ]).set_index([0, 1]).rename_axis(['a', 'b'])
>>> df.columns = pd.MultiIndex.from_tuples([
...    ('c', 'e'), ('d', 'f')
... ], names=['level_1', 'level_2'])
>>> df
level_1   c   d
level_2   e   f
a b
1 2      3   4
5 6      7   8
9 10    11  12
>>> df.droplevel('a')
level_1   c   d
level_2   e   f
b
2        3   4
6        7   8
10      11  12
>>> df.droplevel('level2', axis=1)
level_1   c   d
a b
1 2      3   4
5 6      7   8
9 10    11  12

分組聚合併分列

需求:

首先,讀取數據:

df = pd.read_excel("分組聚合併分列.xlsx")
df

結果:

實現代碼:

(
    df.groupby("姓名")["得分"]
    .apply(list)
    .apply(pd.Series)
    .fillna("")
    .rename(columns=lambda x: f"得分{x+1}")
    .reset_index()
    .astype({"得分1":"int8"})
)

結果:

分布解析:

首先將每個姓名的得分聚合成列表,並最終返回一個Series:

df.groupby("姓名")["得分"].apply(list)

結果:

姓名
孫四娘          [7, 28]
看見星光    [88, 28, 23]
看見月光    [69, 10, 87]
老祝          [51, 29]
馬青梅             [99]
Name: 得分, dtype: object

當然,這步的標準寫法應該是使用Series的內部方法:

df.groupby("姓名")["得分"].apply(lambda x:x.to_list())

使用Series內部方法的性能比python列表方法轉換快一些。

作為一個Series就可以通過將每個列表元素轉換為Series,從而最終返回一個分列的Datafream:

_.apply(pd.Series)

結果:

注意:_在ipython表示上一個輸出返回的結果,jupyter還額外支持_num表示num編號單元格的輸出。

_.fillna("")

結果:

fillna表示填充缺失值,傳入""表示將缺失值填充為空字符串。

下面重命名一下列名:

_.rename(columns=lambda x: f"得分{x+1}")

結果:

然後還原索引:

_.reset_index()

結果:

發現結果中有一列,不是整數,所以還原成整數(總分100分,8位足夠存儲):

_.astype({"得分1":"int8"})

結果:

解析json字符串並字典分列

需求:

首先讀取數據:

df = pd.read_excel("字典分列.xlsx")
df.head()

結果:

處理代碼:

result = df.features.apply(eval).apply(pd.Series)
result["counts"] = df.counts
result

結果:


儲存條件品牌推薦理由品種食用方式是否進口特色服務是否有機counts0常溫NaNNaNNaNNaNNaNNaNNaN331冷藏NaNNaNNaNNaNNaNNaNNaN242常溫禾煜NaNNaNNaNNaNNaNNaN223常溫妙潔NaNNaNNaNNaNNaNNaN164冷凍NaNNaNNaNNaNNaNNaNNaN142083常溫樂事夠薄夠脆NaNNaNNaNNaNNaN12084冷藏NaN生態種植黃瓜NaNNaNNaN有機12085冷藏NaN腥味較淡鯽魚NaNNaN免費宰殺NaN12086冷藏NaN甜脆可口佛手瓜NaNNaNNaNNaN12087冷藏叮咚日日鮮全程可追溯豬小排NaNNaNNaNNaN1

2088 rows × 9 columns

淺析:

df.features.apply(eval)用於將features列的每個json字符串解析為字典對象。

**.apply(pd.Series)則可以將每個字典對象轉換成Series,則可以將該字典擴展到多列,並將原始的Series轉換為Datafream。

而result["counts"] = df.counts則將原始數據的counts列添加到結果列中。

相關焦點

  • Pandas案例精進 | 實現列表分列與字典分列的三個實例
    這次我將分享三個實際案例,讓大家看看列表分列的一些實際應用。作為一個Series就可以通過將每個列表元素轉換為Series,從而最終返回一個分列的Datafream:_.apply(pd.Series)結果:
  • SQL如何實現Excel的分列功能?
    類似Excel中按指定字符進行分列,今天給大家介紹兩種處理方法。藉助Excel進行分割先將數據從資料庫導出到Excel,使用Excel進行分列後再導入到資料庫中。注意再次導入需要改變表結構,因為分列後數據欄位變多了,必須新建列進行匹配。
  • 一道基礎題,多種解題思路,引出Pandas多個知識點
    詳解mydict.items()是python基礎字典的內容,它返回了這個字典鍵值對組成的元組列表列表分列的2種方法列表分列的思路:Pandas的Series對象調用apply方法單個元素返回的結果是Series時,這個Series的每個數據會作為Datafrem的每一列,索引會作為列名
  • 分列是個好工具,可惜你不會【Excel教程】
    分列功能不僅能夠實現對數據地有效拆分,而且還是規範數據格式的利器。分列功能這麼好用,你真的會使用嗎?今天就和大家詳細介紹下分列功能的使用方法。excel分列功能一:按照固定寬度進行數據拆分  情景: 如下圖所示,在日常工作中,我們經常需要根據人員的身份證號來提取出生年月日等信息。
  • 用PowerQuery對Excel中漢字和中文混雜的數據進行複雜分列
    還有數字後面跟了「可議價」這樣的漢字,也不需要型號和對應的數字中間沒有空格,多個型號及其數字也沒有用任何分隔符分開下面我們來尋找Excel中的可用方法:無法直接用Excel的分列功能實現分列,因為無法判定具體的分隔符,也沒有固定的位置可用於分列無法用類似於LEFT()、MID()這樣的函數來分別提取型號和數字,因為型號和數字的長度都不一樣,而且每一行要提取的數據個數也不同。
  • Excel的分列功能很強大,SQL能實現嗎?
    類似Excel中按指定字符進行分列,今天給大家介紹兩種處理方法。先將數據從資料庫導出到Excel,使用Excel進行分列後再導入到資料庫中。注意再次導入需要改變表結構,因為分列後數據欄位變多了,必須新建列進行匹配。
  • VBA不服Excel分列功能系列(1),VBA能同時多列拆分
    VBA早間檔VBA早間檔,利用簡單的幾分鐘,學習一些簡單的VBA知識,提升工作效率今日主題今天我們繼續昨天的話題,VBA中split方法能夠實現Excel自帶的分列功能效果,不過有很多小夥伴也不是很滿足,既然能夠用Excel自帶的分列功能來實現我的需求
  • 詳解Excel中分列的使用方法
    在Excel的數據功能卡下即可找到分列工具,列是我們經常用到的最簡單的數據清洗工具,下面讓我一起來認識它。分列主要分為以分隔符號和固定寬度兩種,一共分為三步1選擇分列方式2.選擇分列效果3.確定每一列的數據類型以分割符號分列:適用於數據源帶有某些特定的符號如:逗號,冒號,空格等,漢字也可以作為分隔符來使用以固定寬度分列
  • 數據分列、精準篩選、下拉、分類匯總,Excel最實用的數據功能區
    數據功能區默認分為:獲取外部數據、獲取和轉換、連接、排序和篩選、數據工具、預測、分級顯示七個版塊。這裡重點說下如何精準篩選,如下圖所示,精選篩選「張三」這個人,如果只輸入張三兩個字,會出現所有名字中帶「張三」的數據,那麼如何精準篩選?
  • Python數據分析利器,Pandas入門介紹,幫你便捷高效處理複雜數據
    pandas(pannel data analysis,面板數據分析),我個人覺得pandas用於數據分析處理有別於Python字典和列表的主要在於以下三點。運算效率提升,pandas是基於numpy寫的,換句話說也是c語言進行編寫並編譯成本地庫的,在運算效率會高很多。
  • SQL如何實現Excel的分列功能(按指定符號進行分割)?
    類似Excel中按指定字符進行分列,今天給大家介紹兩種處理方法。藉助Excel進行分割先將數據從資料庫導出到Excel,使用Excel進行分列後再導入到資料庫中。注意再次導入需要改變表結構,因為分列後數據欄位變多了,必須新建列進行匹配。
  • Excel教程:看看,你真的會用Excel分列功能嗎?
    在談到Excel數據處理相關技巧時,分列功能經常被提到。分列功能不僅能夠實現對數據有效拆分,而且還是規範數據格式的利器。
  • Excel中文本分列的3個技巧,好不好用,看看就知道!
    >彈出文本分列嚮導第1步,不用選擇,點擊下一步第2步中的選項也不用選擇,點擊下一步第3步中「列數據格式」選擇常規,點擊「完成」即可銷量列的格式就全部轉化成常規啦。小編提示:身份證號碼第7位至14位是出生日期同樣選擇「數據」菜單選擇「分列」功能彈出文本分列嚮導第1步,原始數據類型,選擇「固定寬度」,然後點擊下一步
  • excel拆分技巧:如何快速對金額數字進行分列
    編按:金額數字分列,相信是做財務的小夥伴們經常遇到的問題。網上關於金額數字分列的方法很多,但用到的公式大都比較複雜。今天我們就來分享一個最簡單的公式,僅用LEFT、RIGHT和COLUMN三個函數,就能達到效果!小夥伴們趕緊上手試試吧!
  • excel拆分技巧:如何快速對金額數字進行分列
    編按:金額數字分列,相信是做財務的小夥伴們經常遇到的問題。網上關於金額數字分列的方法很多,但用到的公式大都比較複雜。今天我們就來分享一個最簡單的公式,僅用LEFT、RIGHT和COLUMN三個函數,就能達到效果!小夥伴們趕緊上手試試吧!
  • 用符號提取,快速完成Excel數據分列
    選中需要進行分列的單元格後,在「數據」選項卡中找到「數據工具」組,點擊「分列」,就會出現「文本分列導向」,在這個窗口中我們可以看到有兩個選項:「分隔符號」和「固定寬度」。 ④分列結果的二次處理用上面同樣的方法分列得到省和市的名稱,但是分列之後「省」字就被吞掉了,所以我們需要對結果進行二次處理。
  • word表格轉換功能:規律分隔文本,如何快速分列顯示
    話不多說,先來看看下圖:有時我們從系統裡面導出來的數據就像上面圖中一樣,是以逗號(PS:此處是英文半角狀態下的逗號)作為分隔符號將數據分開,現在需要將其分成三列顯示。大部分小夥伴們可能最先想到的應該是用Excel的【分列】功能來處理。
  • word表格轉換功能:規律分隔文本,如何快速分列顯示
    有時我們從系統裡面導出來的數據就像上面圖中一樣,是以逗號(PS:此處是英文半角狀態下的逗號)作為分隔符號將數據分開,現在需要將其分成三列顯示】,打開【分列】對話框,選擇【分隔符號】之後,點擊【下一步】按鈕。
  • excel應用技巧:數據分列功能還有什麼功用?
    選中需要分列的數據區域。單擊「數據」選項卡下的「分列」按鈕。大家一定想不到,輸入日期最快的方式竟然是採用數據分列!如下圖所示,我們先直接輸入年月日的8位數字。(注意:8位數字是指4位年份數字2位月份數字2位日子數字。譬如2月要輸成02,5號要輸成05。)
  • Excel技巧講解(九)-數據分列快速使用技巧
    ,一般這種情況下我們經常會用到分列功能。分列功能不僅能有效對數據進行拆分,而且還能快速統一規範數據格式。今天就和大家分享下EXCEL數據分列功能。應用場景:如果原始數據是混雜在一起的數據,如下圖中的數據所示,直接複製粘貼的話,數據在EXCEL表格中會堆積在同一個單元格裡,如何快速整理出數據呢?