Распаковать словарь из Pandas Column - PullRequest
0 голосов
/ 24 мая 2018

У меня есть датафрейм с одним из столбцов в качестве словаря.Я хочу распаковать его в несколько столбцов (т.е. код, количество - это отдельные столбцы в приведенном ниже формате столбца Raw).Следующий код, используемый для работы с pandas v0.22, теперь (0.23) выдает ошибку индекса:

pd.DataFrame.from_records(df.col_name.fillna(pd.Series([{'code':'not applicable'}], index=df.index)).values.tolist())

ValueError: Length of passed values is 1, index implies x

Я искал переполнение в google / stack в течение нескольких часов, и ни одно из ранее представленных решений больше не работает.

Формат необработанного столбца:

     dict_codes
0   {'code': 'xx', 'amount': '10.00',...
1   {'code': 'yy', 'amount': '20.00'...
2   {'code': 'bb', 'amount': '30.00'...
3   {'code': 'aa', 'amount': '40.00'...
10  {'code': 'zz', 'amount': '50.00'...
11                            NaN
12                            NaN
13                            NaN

У кого-нибудь есть предложения?

Спасибо

Ответы [ 2 ]

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

Настройка

df = pd.DataFrame(dict(
    codes=[
        {'amount': 12, 'code': 'a'},
        {'amount': 19, 'code': 'x'},
        {'amount': 37, 'code': 'm'},
        np.nan,
        np.nan,
        np.nan,
    ]
))

df

                         codes
0  {'amount': 12, 'code': 'a'}
1  {'amount': 19, 'code': 'x'}
2  {'amount': 37, 'code': 'm'}
3                          NaN
4                          NaN
5                          NaN

apply с pd.Series

Убедитесь, что dropna сначала

df.codes.dropna().apply(pd.Series)

   amount code
0      12    a
1      19    x
2      37    m

df.drop('codes', 1).assign(**df.codes.dropna().apply(pd.Series))

   amount code
0    12.0    a
1    19.0    x
2    37.0    m
3     NaN  NaN
4     NaN  NaN
5     NaN  NaN

tolist и from_records

Та же идея, но пропустить apply

pd.DataFrame.from_records(df.codes.dropna().tolist())

   amount code
0      12    a
1      19    x
2      37    m

df.drop('codes', 1).assign(**pd.DataFrame.from_records(df.codes.dropna().tolist()))

   amount code
0    12.0    a
1    19.0    x
2    37.0    m
3     NaN  NaN
4     NaN  NaN
5     NaN  NaN
0 голосов
/ 24 мая 2018

Настройка

                        codes
0  {'amount': 12, 'code': 10}
1    {'amount': 3, 'code': 3}

apply с pd.Series

df.codes.apply(pd.Series)

   amount  code
0      12    10
1       3     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...