Преобразование строк-списков в строки - PullRequest
0 голосов
/ 09 мая 2018

У меня есть кадр данных панд, как это:

df = pandas.DataFrame({
        'Grouping': ["A", "B", "C"], 
        'Elements': ['[\"A1\"]', '[\"B1\", \"B2\", \"B3\"]', '[\"C1\", \"C2\"]']
    }).set_index('Grouping')

так

            Elements
Grouping
===============================
A           ["A1"]
B           ["B1", "B2", "B3"]
C           ["C1", "C2"]

т.е. некоторые списки кодируются как строки-списки. Что является чистым способом преобразовать это в аккуратный набор данных как это:

            Elements
Grouping
====================
A           A1
B           B1
B           B2
B           B3
C           C1
C           C2

не прибегая к петле? Лучшее, что я могу придумать, это:

df1 = pandas.DataFrame()
for index, row in df.iterrows():
    df_temp = pandas.DataFrame({'Elements': row['Elements'].replace("[\"", "").replace("\"]", "").split('\", \"')})
    df_temp['Grouping'] = index
    df1 = pandas.concat([df1, df_temp])
df1.set_index('Grouping', inplace=True)

но это довольно уродливо.

Ответы [ 2 ]

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

Вы можете использовать .str.extractall():

df.Elements.str.extractall(r'"(.+?)"').reset_index(level="match", drop=True).rename({0:"Elements"}, axis=1)

результат:

         Elements
Grouping         
A              A1
B              B1
B              B2
B              B3
C              C1
C              C2
0 голосов
/ 09 мая 2018

Вы можете преобразовать свой «список» в list, тогда мы делаем apply с pd.Series и stack

import ast
df.Elements=df.Elements.apply(ast.literal_eval)
df.Elements.apply(pd.Series).stack().reset_index(level=1,drop=True).to_frame('Elements')
         Elements
Grouping         
A              A1
B              B1
B              B2
B              B3
C              C1
C              C2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...