網(wǎng)站首頁 編程語言 正文
楔子
pandas 支持我們從 Excel、CSV、數(shù)據(jù)庫等不同數(shù)據(jù)源當中讀取數(shù)據(jù),來構建 DataFrame。但有時數(shù)據(jù)并不來自這些外部數(shù)據(jù)源,而是來自一個已經(jīng)存在的 Python 數(shù)據(jù)結構,比如列表、字典等等。
同理當需要導出 DataFrame 時,也不一定非要寫到外部文件里,而是希望生成字典或者列表,那么這個時候該怎么做呢?
所以這就涉及到了 DataFrame 和 Python 內置數(shù)據(jù)結構之間的相互轉換,下面來介紹一些最佳實踐,你可以根據(jù)實際情況進行選擇。
DataFrame 轉成內置數(shù)據(jù)結構
假設有這樣一個 DataFrame:
import?pandas?as?pd
df?=?pd.DataFrame({"name":?["Satori",?"Koishi",?"Marisa"],
???????????????????"score":?[99,?98,?100],
???????????????????"rank":?[2,?3,?1]})
print(df)
"""
?????name??score??rank
0??Satori?????99?????2
1??Koishi?????98?????3
2??Marisa????100?????1
"""
那么看看 DataFrame 都提供了哪些方法,以及在轉成內置數(shù)據(jù)結構之后是什么樣子?
df.to_records()
將 DataFrame 轉成 Numpy 的數(shù)組,數(shù)組里面是一個個的元組。
print(df.to_records())
"""
[(0,?'Satori',??99,?2)?(1,?'Koishi',??98,?3)?(2,?'Marisa',?100,?1)]
"""
#?返回的時候將索引也帶上了,我們可以去掉
print(df.to_records(index=False))
"""
[('Satori',??99,?2)?('Koishi',??98,?3)?('Marisa',?100,?1)]
"""
#?df.to_records?返回的是?numpy?的數(shù)組,可以再轉成列表
print(df.to_records(index=False).tolist())
"""
[('Satori',?99,?2),?('Koishi',?98,?3),?('Marisa',?100,?1)]
"""
這種數(shù)據(jù)結構還是很常見的,在工作中經(jīng)常會用到。但唯一不好的是,字段信息丟失了。
df.to_dict()
將 DataFrame 轉成 Python 的字典。
#?返回?Python?的字典,key?是字段名,value?是對應的每一列
print(df.to_dict())
"""
{'name':?{0:?'Satori',?1:?'Koishi',?2:?'Marisa'},
?'rank':?{0:?2,?1:?3,?2:?1},
?'score':?{0:?99,?1:?98,?2:?100}}
"""
#?但這里的?value?有一些問題,就是它把索引也包含在里面了
#?我們可以去掉它
print(
????{k:?tuple(v.values())?for?k,?v?in?df.to_dict().items()}
)
"""
{'name':?('Satori',?'Koishi',?'Marisa'),
?'rank':?(2,?3,?1),
?'score':?(99,?98,?100)}
"""
#?當然啦,to_dict()?還可以手動實現(xiàn)
print(
????{col:?tuple(df[col])?for?col?in?df.columns}
)
"""
{'name':?('Satori',?'Koishi',?'Marisa'),
?'rank':?(2,?3,?1),
?'score':?(99,?98,?100)}
"""
這種格式的數(shù)據(jù)用的就不多了,用得更多的是下一種。
df.to_dict(orient="records")
將 DataFrame 轉成 Python 的列表,列表里面是一個個的字典,每個字典代表數(shù)據(jù)的每一行。
print(df.to_dict(orient="records"))
"""
[{'name':?'Satori',?'rank':?2,?'score':?99},
?{'name':?'Koishi',?'rank':?3,?'score':?98},
?{'name':?'Marisa',?'rank':?1,?'score':?100}]
"""
個人覺得這種數(shù)據(jù)結構應該用得最多。
DataFrame 生成的數(shù)據(jù)還有其它格式,這里就不贅述了,常用的就是上面幾種。
內置數(shù)據(jù)結構轉成 DataFrame
內置數(shù)據(jù)結構轉成 DataFrame,我們也來介紹幾個最常用的場景。
import?pandas?as?pd
data?=?[{'name':?'Satori',?'rank':?2,?'score':?99},
????????{'name':?'Koishi',?'rank':?3,?'score':?98},
????????{'name':?'Marisa',?'rank':?1,?'score':?100}]
#?對于這種數(shù)據(jù),可以通過?DataFrame?的?from_records?方法
#?列表里的字典代表了?DataFrame?的每一行,每個字典都具有相同的?key
#?而這些?key?則表示?DataFrame?的列
print(pd.DataFrame.from_records(data))
"""
?????name??rank??score
0??Satori?????2?????99
1??Koishi?????3?????98
2??Marisa?????1????100
"""
#?或者更簡單的,直接調用?pd.DataFrame?即可
print(pd.DataFrame(data))
"""
?????name??rank??score
0??Satori?????2?????99
1??Koishi?????3?????98
2??Marisa?????1????100
"""
#?如果列表里面的字典,不具備相同的 key,會怎么樣呢?
data[2]["length"]?=?155
print(pd.DataFrame(data))
"""
?????name??rank??score??length
0??Satori?????2?????99?????NaN
1??Koishi?????3?????98?????NaN
2??Marisa?????1????100???155.0
"""
#?很簡單,會將所有的?key?都考慮在內
#?如果某一行沒有指定的?key,那么對應的值就是空
當然數(shù)據(jù)也可能是這種格式:
import?pandas?as?pd
data?=?{'2020-01-01':?{'name':?'Satori',?'rank':?2,?'score':?99},
????????'2020-01-02':?{'name':?'Koishi',?'rank':?3,?'score':?98},
????????'2020-01-03':?{'name':?'Marisa',?'rank':?1,?'score':?100}}
print(pd.DataFrame.from_dict(data,?orient="index"))
"""
??????????????name??rank??score
2020-01-01??Satori?????2?????99
2020-01-02??Koishi?????3?????98
2020-01-03??Marisa?????1????100
"""
最后一種:
import?pandas?as?pd
data?=?{'name':?['Satori',?'Koishi',?'Marisa'],
????????'rank':?[2,?3,?1],
????????'score':?[99,?98,?100]}
#?直接調用?DataFrame?即可
print(pd.DataFrame(data))
"""
?????name??rank??score
0??Satori?????2?????99
1??Koishi?????3?????98
2??Marisa?????1????100
"""
上面就是本文的內容,比較簡單。并且相關函數(shù)的具體用法,也沒有詳細說明,只是從工作角度介紹了一些最佳實踐。更多內容,可以查看 pandas 的注釋。
原文鏈接:https://mp.weixin.qq.com/s/24sQbbDzaG15TgBqsvU_Dw
相關推薦
- 2022-07-19 react props的特點
- 2022-07-16 CSS 輪廓(outline)/CSS margin(外邊距)/CSS padding(填充)
- 2022-02-09 Linux驅動之platform總線詳解_Linux
- 2023-03-03 PostgreSQL時間日期的語法及注意事項_PostgreSQL
- 2022-06-23 C++11中模板隱式實例化與顯式實例化的定義詳解分析_C 語言
- 2022-08-29 Oracle中日期的使用方法實例_oracle
- 2023-01-02 Android?數(shù)據(jù)結構全面總結分析_Android
- 2022-05-12 正則判斷只能輸入大于0的正整數(shù)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支