pandas 優雅處理值類型為list的列的csv讀寫問題

文章目錄

  • 直接存儲
  • join list 變成字符串存儲
  • json.dumps序列化存儲以及json.loads反序列化讀取
  • 總結

之所以分析這個問題,是因為讀者在跟第三方數據供應商對接數據的時候,老是會遇到數據加載都會出錯的問題,其中一個原因就是list類型數據沒有正確儲存,于是筆者在這篇文章里面詳細分析一下list數據怎么優雅的寫入csv以及讀取.

直接存儲

第一種方法,直接存,不做任何轉換

def direct_write_read():path = Path(__file__).parent.joinpath('direct.csv')df = pd.DataFrame({'id': [1,2,3],'tags': [['tag1', 'tag2'], ['tag3'], ['tag4', 'tag5']]})df.to_csv(path, index=False, encoding='utf-8')rd_df = pd.read_csv(path, encoding='utf-8')print(rd_df['tags'])

csv文件內容

id,tags
1,"['tag1', 'tag2']"
2,['tag3']
3,"['tag4', 'tag5']"

程序打印結果

0    ['tag1', 'tag2']
1            ['tag3']
2    ['tag4', 'tag5']
Name: tags, dtype: object

整個程序能運行,應為都是用的python寫文件讀取文件,但是csv文件內容不標準,這種處理方式存在潛在問題,容易出現python語言能讀寫,但是換成其它語言程序讀取此csv就可能出現錯誤,因此不推薦這種處理方式.

join list 變成字符串存儲

第二種方法,使用','.join(list)方法將列表連接成字符串存csv,讀取的時候再將字符串按照連接字符進行分割.

def join_write_read():path = Path(__file__).parent.joinpath('join.csv')df = pd.DataFrame({'id': [1,2,3],'tags': [['tag1', 'tag2'], ['tag3'], ['tag4', 'tag5']]})df['append'] = df['tags'].apply(lambda x: ','.join(x))df[['id', 'append']].to_csv(path, index=False, encoding='utf-8')rd_df = pd.read_csv(path, encoding='utf-8')rd_df['tags'] = rd_df['append'].apply(lambda x: x.split(','))print(rd_df['tags'])

csv文件內容:

id,append
1,"tag1,tag2"
2,tag3
3,"tag4,tag5"

注意這里自動加入了雙引號 文本限定符,因為連接字符為逗號和csv分割符號一致,使用雙引號限定符避免因為逗號問題破壞csv結構.
程序輸出結果:

0    [tag1, tag2]
1          [tag3]
2    [tag4, tag5]

這種方法只能正對簡單的字符串列表,且列表中每一個元素字符串不能存再鏈接字符,不然讀取的數據split后就錯誤
所以這種方法只能在你確定了列表中元素字符串都不可能有用于連接的字符時,才使用.總之,此方法也有其局限性.

json.dumps序列化存儲以及json.loads反序列化讀取

這是目前最好的處理方法,將列表使用json.dumps方法序列化為json字符串存儲,讀取的時候反序列化成列表即可:

def json_write_read():path = Path(__file__).parent.joinpath('json.csv')df = pd.DataFrame({'id': [1,2,3],'tags': [['tag1', 'tag2'], ['tag3'], ['tag4', 'tag5']]})df['json'] = df['tags'].apply(json.dumps)df[['id', 'json']].to_csv(path, index=False, encoding='utf-8')rd_df = pd.read_csv(path, encoding='utf-8')rd_df['tags'] = rd_df['json'].apply(json.loads)print(rd_df['tags'])print(rd_df['tags'][0])

csv文本內容:

id,json
1,"[""tag1"", ""tag2""]"
2,"[""tag3""]"
3,"[""tag4"", ""tag5""]"

非常標準的list字符串存csv
程序輸出結果

0    [tag1, tag2]
1          [tag3]
2    [tag4, tag5]
Name: tags, dtype: object

此方法還可以用來存儲以及讀取向兩數據,如下例子處理向量數據的讀寫問題

def vec_write_read():path = Path(__file__).parent.joinpath('vec.csv')df = pd.DataFrame({'id': [1,2,3],'vec': [[1, 2, 3], [2, 0, 1], [1, 1, 2]]})df['vec_s'] = df['vec'].apply(json.dumps)df[['id', 'vec_s']].to_csv(path, index=False)rd_df = pd.read_csv(path)rd_df['vec'] = rd_df['vec_s'].apply(json.loads)print(rd_df['vec'])

csv文件內容:

id,vec_s
1,"[1, 2, 3]"
2,"[2, 0, 1]"
3,"[1, 1, 2]"

輸出結果:

0    [1, 2, 3]
1    [2, 0, 1]
2    [1, 1, 2]
Name: vec, dtype: object

如果這個場景還在用第二種join方式轉成字符串還需要把每個維度數值轉為字符串才能join,實現起來就不太合適了.

總結

所以pandas里面list數據列存csv最佳做法還是將該列數據json.dumps成json字符串保存,讀取的時候使用json.loads還原

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86663.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一種解決 OpenWrt 安裝 docker 之后局域網的設備之間無法互相訪問通信的方法

文章目錄 一、問題背景二、解決方案(方法一)修改全局設置的 轉發( forward) 為 接受(ACCEPT)(方法二)設置 net.bridge.bridge-nf-call-iptables0 并將 docker 的容器網絡設置為host …

Leetcode百題斬-貪心

貪心也是一個很有意思的專題,能遇到很多神奇的思路。 但這個專題,leetcode也沒放Hard,果然是怕這種玄學專題上點難度大家罩不住。那就很快了,直接過 763. Partition Labels[Medium] 思路:將字母串分組,相…

基于多徑信道的分集接收技術性能優化與仿真分析

基于多徑信道的分集接收技術性能優化與仿真分析 一、多徑信道建模與仿真 1. 多徑信道建模(MATLAB實現) classdef MultipathChannel < handlepropertiesSampleRate = 1e6; % 采樣率 (Hz)MaxDoppler = 100; % 最大多普勒頻移 (Hz)DelayVector = [0

LeetCode 713.乘積小于K的子數組

給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回子數組內所有元素的乘積嚴格小于 k 的連續子數組的數目。 示例 1&#xff1a; 輸入&#xff1a;nums [10,5,2,6], k 100 輸出&#xff1a;8 解釋&#xff1a;8 個乘積小于 100 的子數組分別為&#xff1a;[10]、[5…

打破網絡安全孤島:實現防御數據協作

作者&#xff1a;來自 Elastic Crossley McEwen, Oksana Abramovych 現代網絡戰場不再受組織邊界的限制。在各類防御網絡中&#xff0c;關鍵的結構化、非結構化和半結構化數據分布在不同的專業環境中&#xff0c;形成孤島 —— 從機密情報系統到作戰指揮平臺&#xff0c;再到戰…

給定一個沒有重復元素的數組,寫出生成這個數組的MaxTree的函數

題目&#xff1a; 給定一個沒有重復元素的數組arr&#xff0c;寫出生成這個數組的MaxTree的 函數&#xff0c;要求如果數組長度為N&#xff0c;則時間復雜度為O(N)、額外空間復雜度 為O(N)。 一個數組的MaxTree定義如下。 ● 數組必須沒有重復元素。 ● MaxTree是一棵二叉…

iOS 抓包實戰:時間戳偏差導致的數據同步異常排查記錄

“這條數據不是我填的”“我的更新被覆蓋了”“兩個設備顯示不一致”——這些是產品上線后最令人頭疼的反饋。 最近我們在一次用戶同步問題排查中&#xff0c;發現表面是“數據丟失”問題&#xff0c;實則是多端數據提交時間戳處理不一致&#xff0c;導致后臺認為老數據為新&a…

一款支持多日志器、多級別、多落地方式的同異步日志系統

文章目錄 簡介項目特點項目實現基礎功能模塊實現文件操作以及日期時間獲取日志等級日志信息描述 異步功能模塊實現緩沖區實現異步線程實現 核心功能模塊實現日志格式解析落地操作實現日志器實現 測試測試環境測試參數測試結果性能分析 附件 簡介 在現代軟件開發與系統運維領域…

加固筆記本在戶外勘探行業的應用:探索與科技的融合

在自然資源勘探、地質調查、石油天然氣開發、礦產資源測繪等戶外勘探行業中&#xff0c;作業環境常常復雜多變&#xff1a;風沙漫天的戈壁、雨雪交加的山區、濕熱潮濕的叢林&#xff0c;甚至是極寒與高溫并存的極端氣候條件。面對這些挑戰&#xff0c;普通的辦公設備早已無法勝…

MySQL 連接指定端口后,為什么實際仍是 3306?

文章目錄 MySQL 連接指定端口后&#xff0c;為什么實際仍是 3306&#xff1f;問題現象復現原因分析沒有指定 -h&#xff0c;默認走的是本地 Unix Socket多實例環境中未顯式指定目標地址 正確的連接方法方法一&#xff1a;添加 -h 127.0.0.1方法二&#xff1a;添加 --protocolTC…

【Android當用戶兩次打斷息屏操作后,屏幕將會在10分鐘內無法熄滅并持續點亮(關閉Android13新增的dim功能)】

UndimDetectorWakeLock持鎖導致屏幕不滅問題處理SOP 問題描述 在Android T版本中&#xff0c;系統新增了SCREEN_BRIGHT_WAKE_LOCK&#xff08;UndimDetectorWakeLock&#xff09;機制。當設備處于低亮度&#xff08;dim&#xff09;狀態時&#xff0c;用戶兩次打斷屏幕熄滅操…

Tailwind CSS自定義用法

文章目錄 前言? 一、集成 Tailwind CSS 到 React 項目1. 安裝依賴2. 配置 tailwind.config.js3. 創建全局樣式文件&#xff08;如 src/index.css&#xff09;tailwind base;tailwind components;tailwind utilities; 4. 在 main.tsx 或 main.jsx 中引入樣式 ? 二、自定義樣式…

linux面試常考

常用指令 常見題

Spring Boot 2.2.6調用DeepSeek API并通過SSE將流式響應推送給前端的完整實現

1. 添加依賴 (pom.xml) <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- SSE 支持 --><depe…

LM1117-ADJ 簡單介紹

LM1117-ADJ是一款可調輸出電壓的低壓差線性穩壓器&#xff08;LDO&#xff09;&#xff0c;具有以下關鍵特性和應用要點&#xff1a; 核心特性 可調輸出電壓 通過外部分壓電阻&#xff08;R1和R2&#xff09;調節輸出電壓&#xff0c;范圍為1.25V至13.8V。輸出電壓公式&#…

知名流體控制解決方案供應商“永盛科技”與商派ShopeX達成B2B商城項目合作

2025年6月&#xff0c;全球知名的工業流體控制解決方案服務商——永盛科技&#xff08;股票&#xff1a;874497&#xff09;&#xff0c;與商派ShopeX正式達成B2B商城項目合作。 此次合作將共同推動永盛科技B2B業務的數字化變革&#xff0c;提高B2B業務運營效率&#xff0c;同…

jvm簡單八股

1、jvm中內存分為那幾個區域&#xff0c;1.7和1.8 jvm 中主要有 程序計數器、虛擬機棧、本地方法棧、堆、方法區、直接內存。 線程私有的有&#xff1a;程序計數器、虛擬機棧、本地方法棧 線程共有的有&#xff1a;堆、方法區、直接內存 堆空間又可以分為&#xff1a;新時代、…

contOS7安裝docker命令及yum源更換為國內源

docker介紹 Docker是一個開源的容器化平臺,通過將應用程序及其依賴打包成輕量級、可移植的容器,確保開發、測試和部署環境的一致性。Docker的核心概念包括容器、鏡像、Dockerfile和鏡像倉庫。容器是輕量級的虛擬化技術,共享宿主機內核但保持獨立運行環境,啟動快且資源占用少…

SpringBoot集成Redis-6.x版本流程

SpringBoot集成Redis是我們常見的功能&#xff0c;今天我們分享一下&#xff1a; 前言&#xff1a; 1、pom包引用 <!-- Redis Starter (默認使用 Lettuce) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…

zookeeper Curator(3):Watch事件監聽

文章目錄 Curator API 常用操作 Watch事件監聽NodeCachePathChildrenCacheTreeCache 本章代碼已分享至Gitee: https://gitee.com/lengcz/curator01 Curator API 常用操作 Watch事件監聽 zookeeper 允許用戶在指定節點上注冊一些Watcher &#xff0c;并且在一些特定事件觸發的時…