带有不规则格式列表列的csv如何导入到pandas DataFrame中?

时间:2018-09-30 21:53:55

标签: python pandas dataframe

以下csv由列表组成。但是,第(2)position_start和第(3)position_end列的列表格式不正确(即没有单独的逗号)。

我想将csv读入一个四列的熊猫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]

谢谢

1 个答案:

答案 0 :(得分:0)

Notebook: 2018-09-30_columns_mix_format_lists.ipynb

进口:

import pandas as pd
import re

df = pd.read_csv('Book1.csv', index_col=0)

输出:

enter image description here

每个单元格都是csv中列表形式的字符串,并且position_startposition_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 with processed lists

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

如果您想要一个每个单元格都是一个单独值的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')

最终输出:

Final Output DataFrame

所有值现已解压到单个单元格中。

请记住在选中的解决方案旁边打勾。