анализировать из файла CSV python - PullRequest
3 голосов
/ 21 февраля 2020

Я читаю данные из CSV-файла, такие как:

import pandas as pd
data_1=pd.read_csv("sample.csv")
data_1.head(10)

У него есть два столбца:

ID   detail
1    [{'a': 1, 'b': 1.85, 'c': 'aaaa', 'd': 6}, {'a': 2, 'b': 3.89, 'c': 'bbbb', 'd': 10}]

столбец сведений не является json, но это dict, и я хочу сплющить dict и хочу, чтобы результат был примерно таким:

ID  a   b     c     d
1   1   1.85  aaaa  6
1   2   3.89  bbbb  10

Я всегда получаю a, b, c, d в столбце сведений и хочу переместить окончательные результаты в sql таблица.

Может кто-нибудь, пожалуйста, помогите мне, как решить это.

1 Ответ

3 голосов
/ 21 февраля 2020

Используйте словарь с ast.literal для преобразования строк repr в список диктов и преобразования его в DataFrame, затем используйте concat и конвертируйте первый уровень столбца MultiIndex в ID :

import ast

d = {i: pd.DataFrame(ast.literal_eval(d)) for i, d in df[['ID','detail']].to_numpy()}
#for oldier pandas version use .values
#d = {i: pd.DataFrame(ast.literal_eval(d)) for i, d in df[['ID','detail']].values)}
df = pd.concat(d).reset_index(level=1, drop=True).rename_axis('ID').reset_index()
print (df)
   ID  a     b     c   d
0   1  1  1.85  aaaa   6
1   1  2  3.89  bbbb  10

Или используйте понимание lsit с DataFrame.assign для столбца ID, только необходимый порядок изменения столбцов - от последнего столбца к первому:

import ast

L = [pd.DataFrame(ast.literal_eval(d)).assign(ID=i) for i, d in df[['ID','detail']].to_numpy()]
#for oldier pandas versions use .values
#L = [pd.DataFrame(ast.literal_eval(d)).assign(ID=i) for i, d in df[['ID','detail']].values]
df = pd.concat(L, ignore_index=True)
df = df[df.columns[-1:].tolist() + df.columns[:-1].tolist()]
print (df)
   ID  a     b     c   d
0   1  1  1.85  aaaa   6
1   1  2  3.89  bbbb  10

РЕДАКТИРОВАТЬ:

Для 2 идентификаторов изменить второе решение:

d = [pd.DataFrame(ast.literal_eval(d)).assign(ID1=i1, ID2=i2) for i1, i2, d in df[['ID1','ID2','detail']].to_numpy()]
df = pd.concat(d)
df = df[df.columns[-2:].tolist() + df.columns[:-2].tolist()]
...