Столбец словаря в панде
У меня есть CSV, который я читаю в кадре данных панд. Однако один из столбцов представлен в виде словаря. Вот пример:
ColA, ColB, ColC, ColdD
20, 30, {"ab":"1", "we":"2", "as":"3"},"String"
Как я могу превратить это в фрейм данных, который выглядит следующим образом:
ColA, ColB, AB, WE, AS, ColdD
20, 30, "1", "2", "3", "String"
Я исправил вопрос, похоже, что это строка, которую нужно проанализировать, а не объект dict.
3 ответа
Согласно /questions/48023432/razdelenie-slovarya-spiska-vnutri-stolbtsa-pand-na-otdelnyie-stolbtsyi/48023489#48023489, вы можете использовать .apply(pd.Series)
чтобы отобразить столбец, содержащий данные, в новые столбцы, а затем объединить эти новые столбцы обратно в исходный кадр данных за вычетом исходного столбца, содержащего данные:
dw=pd.DataFrame( [[20, 30, {"ab":"1", "we":"2", "as":"3"},"String"]],
columns=['ColA', 'ColB', 'ColC', 'ColdD'])
pd.concat([dw.drop(['ColC'], axis=1), dw['ColC'].apply(pd.Series)], axis=1)
Возвращает:
ColA ColB ColdD ab as we
20 30 String 1 3 2
Итак, начиная с вашей однорядной дф
Col A Col B Col C Col D
0 20 30 {u'we': 2, u'ab': 1, u'as': 3} String1
РЕДАКТИРОВАТЬ: на основе комментария ОП, я предполагаю, что нам нужно сначала преобразовать строку
import ast
df["ColC"] = df["ColC"].map(lambda d : ast.literal_eval(d))
затем мы конвертируем Col C в dict, транспонируем его и затем присоединяем к оригинальному df
dfNew = df.join(pd.DataFrame(df["Col C"].to_dict()).T)
dfNew
который дает вам это
Col A Col B Col C Col D ab as we
0 20 30 {u'we': 2, u'ab': 1, u'as': 3} String1 1 3 2
Затем мы просто выбираем нужные столбцы в dfNew.
dfNew[["Col A", "Col B", "ab", "we", "as", "Col D"]]
Col A Col B ab we as Col D
0 20 30 1 2 3 String1
Как насчет чего-то вроде:
import pandas as pd
# Create mock dataframe
df = pd.DataFrame([
[20, 30, {'ab':1, 'we':2, 'as':3}, 'String1'],
[21, 31, {'ab':4, 'we':5, 'as':6}, 'String2'],
[22, 32, {'ab':7, 'we':8, 'as':9}, 'String2'],
], columns=['Col A', 'Col B', 'Col C', 'Col D'])
# Create dataframe where you'll store the dictionary values
ddf = pd.DataFrame(columns=['AB','WE','AS'])
# Populate ddf dataframe
for (i,r) in df.iterrows():
e = r['Col C']
ddf.loc[i] = [e['ab'], e['we'], e['as']]
# Replace df with the output of concat(df, ddf)
df = pd.concat([df, ddf], axis=1)
# New column order, also drops old Col C column
df = df[['Col A', 'Col B', 'AB', 'WE', 'AS', 'Col D']]
print(df)
Выход:
Col A Col B AB МЫ КАК Col D 0 20 30 1 2 3 String1 1 21 31 4 5 6 String2 2 22 32 7 8 9 String2