#python #pandas #conditional-statements #calculated-columns
#python #pandas #условные операторы #вычисляемые столбцы
Вопрос:
Я пытаюсь извлечь значения из столбца словарей в pandas и назначить их соответствующим столбцам, которые уже существуют. Я жестко запрограммировал приведенный ниже пример набора данных, который у меня есть:
df_have = pd.DataFrame(
{
'value_column':[np.nan, np.nan, np.nan]
,'date':[np.nan, np.nan, np.nan]
,'string_column':[np.nan, np.nan, np.nan]
, 'dict':[[{'value_column':40},{'date':'2017-08-01'}],[{'value_column':30},
{'string_column':'abc'}],[{'value_column':10},{'date':'2016-12-01'}]]
})
df_have
df_want = pd.DataFrame(
{
'value_column':[40, 30, 10]
,'date':['2017-08-01', np.nan, '2016-12-01']
,'string_column':[np.nan, 'abc', np.nan]
,'dict':[[{'value_column':40},{'date':'2017-08-01'}],[{'value_column':30},
{'string_column':'abc'}],[{'value_column':10},{'date':'2016-12-01'}]]})
df_want
Мне удалось извлечь значения из словарей с помощью циклов:
»’
for row in range(len(df_have)):
row_holder = df_have.dict[row]
number_of_dictionaries_in_the_row = len(row_holder)
for dictionary in range(number_of_dictionaries_in_the_row):
variable_holder = df_have.dict[row][dictionary].keys()
variable = list(variable_holder)[0]
value = df_have.dict[row][dictionary].get(variable)
»’
Теперь мне нужно как-то условно превратить df_have в df_want. Я рад использовать совершенно новый подход и воссоздать все это с нуля. Мы могли бы даже предположить, что у меня есть только фрейм данных со словарями и ничего больше.
Ответ №1:
Вы могли бы использовать строковые методы pandas для извлечения данных, хотя я думаю, что это неэффективно при вложении структур данных в Pandas :
df_have.loc[:, "value_column"] = df_have["dict"].str.get(0).str.get("value_column")
df_have.loc[:, "date"] = df_have["dict"].str.get(-1).str.get("date")
df_have.loc[:, "string_column"] = df_have["dict"].str.get(-1).str.get("string_column")
value_column date string_column dict
0 40 2017-08-01 None [{'value_column': 40}, {'date': '2017-08-01'}]
1 30 None abc [{'value_column': 30}, {'string_column': 'abc'}]
2 10 2016-12-01 None [{'value_column': 10}, {'date': '2016-12-01'}]