将 dict 的 pandas 数据框列扩展为数据框列[重复]

问题描述 投票:0回答:2

我有一个 Pandas DataFrame,其中一列是一系列字典,如下所示:

   colA  colB                                  colC
0     7     7  {'foo': 185, 'bar': 182, 'baz': 148}
1     2     8  {'foo': 117, 'bar': 103, 'baz': 155}
2     5    10  {'foo': 165, 'bar': 184, 'baz': 170}
3     3     2  {'foo': 121, 'bar': 151, 'baz': 187}
4     5     5  {'foo': 137, 'bar': 199, 'baz': 108}

我希望字典中的

foo
bar
baz
键值对成为我的数据框中的列,这样我最终会得到以下结果:

   colA  colB  foo  bar  baz
0     7     7  185  182  148
1     2     8  117  103  155
2     5    10  165  184  170
3     3     2  121  151  187
4     5     5  137  199  108

我该怎么做?

python pandas dictionary dataframe series
2个回答
22
投票

TL;博士

基于 Carlos Horn 的 评论

pd.json_normalize
非常适合此:

df_fixed = df.join(pd.json_normalize(df['colC'])).drop('colC', axis='columns')

旧答案

df = df.drop('colC', axis=1).join(pd.DataFrame(df.colC.values.tolist()))

详细(旧)答案

我们首先定义要使用的 DataFrame,并导入 Pandas:

import pandas as pd


df = pd.DataFrame(
    {
        'colA': {0: 7, 1: 2, 2: 5, 3: 3, 4: 5},
        'colB': {0: 7, 1: 8, 2: 10, 3: 2, 4: 5},
        'colC': {
            0: {'foo': 185, 'bar': 182, 'baz': 148},
            1: {'foo': 117, 'bar': 103, 'baz': 155},
            2: {'foo': 165, 'bar': 184, 'baz': 170},
            3: {'foo': 121, 'bar': 151, 'baz': 187},
            4: {'foo': 137, 'bar': 199, 'baz': 108},
        },
    }
)

colC
列是一个由字典组成的
pd.Series
,我们可以通过将每个字典变成
pd.DataFrame
来将其变成
pd.Series

pd.DataFrame(df.colC.values.tolist())
# df.colC.apply(pd.Series) # this also works, but it is slow

给出

pd.DataFrame
:

   foo  bar  baz
0  154  190  171
1  152  130  164
2  165  125  109
3  153  128  174
4  135  157  188

所以我们需要做的是:

  1. colC
    变成
    pd.DataFrame
  2. colC
     中删除原来的 
    df
  3. 加入皈依者
    colC
    df

这可以用一句话完成:

df = df.drop('colC', axis=1).join(pd.DataFrame(df.colC.values.tolist()))

现在

df
的内容是
pd.DataFrame

   colA  colB  foo  bar  baz
0     2     4  154  190  171
1     4    10  152  130  164
2     4    10  165  125  109
3     3     8  153  128  174
4    10     9  135  157  188

2
投票

我最近面临同样的挑战,我设法使用

apply
join
手动完成此操作。

import pandas as pd

def expand_dict_column(df: pd.DataFrame, column) -> pd.DataFrame:
    df.drop(columns=[column], inplace=False).join(
        df.apply(lambda x: pd.Series(x[column].values(), index=x[column].keys()), axis=1))

对于问题的列,它看起来像这样:

df.drop(columns=["colC"], inplace=False).join(
    df.apply(lambda x: pd.Series(x["colC"].values(), index=x["colC"].keys()), axis=1))
© www.soinside.com 2019 - 2024. All rights reserved.