Преобразовать строку списка словарей в фрейм данных - PullRequest
0 голосов
/ 27 ноября 2018

Это df1:

     indexID    detail                                             object
0          0  [{'y2': 627, 'frame': 1, 'visibility': 0, 'y1'...  Pedestrian
1          3  [{'y2': 699, 'frame': 1, 'visibility': 0, 'y1'...  Pedestrian
2          6  [{'y2': 852, 'frame': 1, 'visibility': 0, 'y1'...  Pedestrian
3          9  [{'y2': 595, 'frame': 1, 'visibility': 0, 'y1'...  Pedestrian
4         12  [{'y2': 629, 'frame': 1, 'visibility': 0, 'y1'...  Pedestrian
5         14  [{'y2': 586, 'frame': 7385, 'visibility': 0, '...  Pedestrian

Внимательно посмотрите на первую ячейку в «детализации»:

[{'y2': 627, 'frame': 1, 'visibility': 0, 'y1': 603, 'score': 1, 'x2': 770, 'x1': 759, 'class': 1}, {'y2': 623, 'frame': 2, 'visibility': 0, 'y1': 599, 'score': 1, 'x2': 777, 'x1': 766, 'class': 1}]

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

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

frame   indexID x1  y1  x2  y2  score   class   visibility
  1         0   759 603 770 627   1       1          0
  2         0   766 599 777 623   1       1          0

ВНИМАНИЕ :

  • Когда я печатаю кадр данных на свой терминал, он показывает, что столбец сведений представляет собой список словарей, как показано выше.Однако, когда я запускаю type(df1['detail'][0]), он возвращает <type 'str'>.
  • В столбце сведений для каждой строки имеется намного больше двух словарей.

Что-то я пытался преобразовать строку в список словарей:

for index,row in df1.iterrows():
            print ast.literal_eval(row['detail'])

Однако я получил эту ошибку:

Traceback (most recent call last):
  File "main.py", line 283, in <module>
    print ast.literal_eval(row['detail'])
  File "/usr/lib/python2.7/ast.py", line 80, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python2.7/ast.py", line 79, in _convert
    raise ValueError('malformed string')
ValueError: malformed string

Ссылка для CSV

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы можете использовать некоторую предварительную обработку перед использованием ast.literal_eval - заменить ][ на ],[ и преобразовать в tuple с, затем использовать понимание списка со сглаживанием:

import ast

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

df['detail'] = df['detail'].str.replace('][','],[', regex=False).apply(ast.literal_eval)
df['detail'] = [x if isinstance(x, tuple) else (x, ) for x in df['detail']]
#print (df)

s = df.set_index('indexID')['detail']
comp = {'{}_{}'.format(k, i): pd.DataFrame(x) for k, v in s.items() for i, x in enumerate(v)}
df = pd.concat(comp)
print (df.head())

       class  frame  score  visibility   x1   x2   y1   y2
0_0 0      1      1      1         0.0  759  770  603  627
    1      1      2      1         0.0  766  777  599  623
    2      1      3      1         0.0  770  786  593  618
    3      1      4      1         0.0  781  792  583  607
    4      1      5      1         0.0  786  800  573  597
0 голосов
/ 27 ноября 2018

попробуйте это,

t=[{'y2': 627, 'frame': 1, 'visibility': 0, 'y1': 603, 'score': 1, 'x2': 770, 'x1': 759, 'class': 1}, {'y2': 623, 'frame': 2, 'visibility': 0, 'y1': 599, 'score': 1, 'x2': 777, 'x1': 766, 'class': 1}]
ind=df['indexID'].values

new_df= pd.DataFrame(t,index=ind)
print new_df

Вывод:

   class  frame  score  visibility   x1   x2   y1   y2
0      1      1      1           0  759  770  603  627
3      1      2      1           0  766  777  599  623

Объяснение:

Сначала создайте фрейм данных из списка, а затем присвойте индекс внешне.

РЕДАКТИРОВАНИЕ-1:

df['detail']=df['detail'].apply(lambda x: ast.literal_eval(x))
print pd.DataFrame(sum(df['detail'].values,[]),index=df['indexID'].values)

Ввод:

   indexID                                         detail      object
0        0     [{'y2': 627, 'frame': 1, 'visibility': 0}]  Pedestrian
1        3     [{'y2': 699, 'frame': 1, 'visibility': 0}]  Pedestrian
2        6     [{'y2': 852, 'frame': 1, 'visibility': 0}]  Pedestrian
3        9     [{'y2': 595, 'frame': 1, 'visibility': 0}]  Pedestrian
4       12     [{'y2': 629, 'frame': 1, 'visibility': 0}]  Pedestrian
5       14  [{'y2': 586, 'frame': 7385, 'visibility': 0}]  Pedestrian

Выход:

    frame  visibility   y2
0       1           0  627
3       1           0  699
6       1           0  852
9       1           0  595
12      1           0  629
14   7385           0  586
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...