Как CSV со столбцами нерегулярно отформатированных списков импортируется в pandas DataFrame? - PullRequest
0 голосов
/ 01 октября 2018

Следующий 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 голосов
/ 01 октября 2018

Записная книжка: 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_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 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

Все значения теперь распакованы в отдельные ячейки.

Пожалуйста, не забудьте поставить галочку рядом с выбранным решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...