首页 > 解决方案 > 如何将带有不规则格式列表列的 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]

谢谢,

标签: pythonpandasdataframe

解决方案


进口:

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

现在每个单元格都用逗号分隔。

如果您想要一个 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')

最终输出:

最终输出数据框

所有值现在都解压缩到单个单元格中。


推荐阅读