Свести фрейм данных Pandas с помощью столбца JSON - PullRequest
0 голосов
/ 17 мая 2018

У меня есть очень большой набор данных в формате CSV, в котором один столбец является строкой JSON.Я хочу прочитать эту информацию в плоский кадр данных Pandas.Как я могу добиться этого эффективно?

Введите CSV:

col1,col2,col3,col4
1,Programming,"{""col3_1"":null,""col3_2"":""Java""}",11
2,Sport,"{""col3_1"":null,""col3_2"":""Soccer""}",22
3,Food,"{""col3_1"":null,""col3_2"":""Pizza""}",33 

Ожидаемый фрейм данных:

+---------------------------------------------------------------+
|   col1    |    col2     |   col3_1    |   col3_2  |   col4    |
+---------------------------------------------------------------+
|    1      | Programming |    None     |    Java   |    11     |
|    2      |    Sport    |    None     |   Soccer  |    22     |
|    3      |    Food     |    None     |   Pizza   |    33     |
+---------------------------------------------------------------+

В настоящее время я могу получить ожидаемый результат, используя следующий код.Я просто хочу знать, есть ли более эффективный способ добиться того же.

import json
import pandas
dataset = pandas.read_csv('/dataset.csv')
dataset['col3'] = dataset['col3'].apply(json.loads)
dataset['col3_1'] = dataset['col3'].apply(lambda row: row['col3_1'])
dataset['col3_2'] = dataset['col3'].apply(lambda row: row['col3_2'])
dataset = dataset.drop(columns=['col3'])

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Используйте для лучшей производительности DataFrame конструктор с DataFrame.pop для столбца извлечения:

df1 = pd.DataFrame(df.pop('col3').apply(pd.io.json.loads).values.tolist(), index=df.index)
df = df.join(df1)
print (df)
   col1         col2  col4 col3_1  col3_2
0     1  Programming    11   None    Java
1     2        Sport    22   None  Soccer
2     3         Food    33   None   Pizza

Деталь

print (df.pop('col3').apply(pd.io.json.loads))
0      {'col3_1': None, 'col3_2': 'Java'}
1    {'col3_1': None, 'col3_2': 'Soccer'}
2     {'col3_1': None, 'col3_2': 'Pizza'}
Name: col3, dtype: object

print (pd.DataFrame(df.pop('col3').apply(pd.io.json.loads).values.tolist(), index=df.index))
  col3_1  col3_2
0   None    Java
1   None  Soccer
2   None   Pizza

Решения похожи, но производительность другая:

df = pd.concat([df] * 10000, ignore_index=True)

In [204]: %timeit df.join(pd.DataFrame(df['col3'].apply(pd.io.json.loads).values.tolist(), index=df.index))
10 loops, best of 3: 76.4 ms per loop

In [205]: %timeit df.join(df['col3'].apply(lambda x: pd.Series(json.loads(x))))
1 loop, best of 3: 11.3 s per loop
0 голосов
/ 17 мая 2018

Вы можете проанализировать JSON в столбце Pandas с помощью json.loads() и преобразовать его в столбцы Pandas с помощью pd.Series():

In [85]: df.join(df.pop('col3').apply(lambda x: pd.Series(json.loads(x))))
Out[85]:
   col1         col2  col4 col3_1  col3_2
0     1  Programming    11   None    Java
1     2        Sport    22   None  Soccer
2     3         Food    33   None   Pizza
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...