python - 如何将带有不规则格式列表列的 csv 导入 pandas DataFrame?
问题描述
以下 csv 由列表组成。但是,列 (2)position_start
和 (3)的列表position_end
格式不正确(即没有逗号分隔)。
我想将 csv 读入一个四列的 pandas DataFrame。
我尝试了以下代码,但没有成功。
position=pd.read_csv(filename, delimiter='\t',index_col=0)
CSV 文件:
,position_c,position_r_theta_phi,position_start,position_end
0,"[14.533842862081656, 0.03208616222764249, 56.92541191588316]","[58.751477765706575, 0.2499741778590546, 0.00220768246933476]",[ 19271.0805564 17808.46240249 18693.4114863 ],[ 19270.18114729 18215.86140969 18693.4114863 ]
1,"[15.565867354362126, 2.2766677669751516, 82.666319295054564]","[84.149865052813752, 0.1880523977235686, 0.1452305063941714]",[ 19301.1424449 17812.85092455 18719.15239368],[ 19242.18330777 18215.96205085 18719.15239368]
2,"[-5.4087970793661952, 8.7687766840863333, 82.903514489531517]","[83.541242779224319, 0.12364001055133951, 2.1234950828837396]",[ 19424.05948468 18127.83826079 18719.38958887],[ 19077.31693912 17913.95893244 18719.38958887]
3,"[5.4876143325782323, -5.6088702278284472, 22.368059246608027]","[23.704501909037916, 0.3373934168579211, 5.4868601633848755]",[ 19115.9817056 17864.06576253 18658.85413363],[ 19407.18754103 18148.97613687 18658.85413363]
谢谢,
飞
解决方案
进口:
import pandas as pd
import re
df = pd.read_csv('Book1.csv', index_col=0)
输出:
每个单元格都是来自 csv 的列表形式的字符串,position_start
并且position_end
不是逗号分隔的。
修复列表:
def list_fix(row):
new_list = []
for x in row:
new_list.append(re.findall(r"[-+]?\d*\.\d+|\d+", x))
return new_list
df_processed = df.apply(lambda row: list_fix(row))
问题中要求的输出:
现在每个单元格都用逗号分隔。
如果您想要一个 DataFrame,其中每个单元格都是一个单独的值:
解压列表:
pos_c = df_processed.position_c.apply(pd.Series)
pos_c = pos_c.rename(columns=lambda x: f'position_c_{x}')
pos_rtp = df_processed.position_r_theta_phi.apply(pd.Series)
pos_rtp = pos_rtp.rename(columns=lambda x: f'position_r_theta_phi_{x}')
pos_s = df_processed.position_start.apply(pd.Series)
pos_s = pos_s.rename(columns=lambda x: f'position_start_{x}')
pos_e = df_processed.position_end.apply(pd.Series)
pos_e = pos_e.rename(columns=lambda x: f'position_end_{x}')
最终数据框:
df_final = pd.concat([pos_c, pos_rtp, pos_s, pos_e], axis=1)
将所有值设置为浮点数:
df_final = df_final.astype('float64')
最终输出:
所有值现在都解压缩到单个单元格中。
推荐阅读
- node.js - “拒绝连接”与 https 和 let-encyrpt
- c# - C# - Foreach 文本文件中的两行
- java - PostgreSQL、Hibernate、IntelliJ IDEA - 创建项目
- c++ - 拖放到特定区域 | Qt
- eclipse - 我可以像 VS 一样让 eclipse 的资源管理器视图“滑动”到分支吗?
- html - LastPass 在点击返回后提示保存密码
- python-3.x - Python类替换不起作用
- java - 在 java 中读取 *.json 文件
- angular - 模拟实用功能Angular 6
- node.js - 在 REST 应用程序中处理数据库错误时,什么被视为标准?