pandas 如何分解列并将其作为频率分类值连接到 Dataframe

eit6fx6z  于 2023-01-07  发布在  其他
关注(0)|答案(2)|浏览(123)

我正在尝试将主 Dataframe 与从另一个 Dataframe 中提取的嵌套dict连接起来
主 Dataframe

摘录的词典

预期结果

这是我试过的

x = pd.concat([df, pd.get_dummies(genres['name'])], axis=1)

x

jobtbby3

jobtbby31#

IIUC,您可以使用:

hot = pd.get_dummies(df.pop('genre').explode().str['name']).groupby(level=0).max()
df = pd.concat([df, hot], axis=1)
print(df)

# Output
    id original_title  Action  Comedy  Drama
0  123          Hello       1       0      1
1  456          World       0       1      0

输入数据:

data = {'genre': [[{'id': 18, 'name': 'Drama'}, {'id': 28, 'name': 'Action'}], 
                  [{'id': 35, 'name': 'Comedy'}]],
        'id': [123, 456], 'original_title': ['Hello', 'World']}
df = pd.DataFrame(data)
print(df)

# Output
                                               genre   id original_title
0  [{'id': 18, 'name': 'Drama'}, {'id': 28, 'name...  123          Hello
1                     [{'id': 35, 'name': 'Comedy'}]  456          World
yiytaume

yiytaume2#

如果我没理解错的话,你只有一个 Dataframe df,你刚刚分解了一列包括流派的数据,并试图将它合并回原始的 Dataframe 。在这种情况下,你不需要这样做。只要使用这个函数。它会填充整个 Dataframe 。

def flatten_nested_json_df(df):
    df = df.reset_index()
    s = (df.applymap(type) == list).all()
    list_columns = s[s].index.tolist()

    s = (df.applymap(type) == dict).all()
    dict_columns = s[s].index.tolist()

    while len(list_columns) > 0 or len(dict_columns) > 0:
        new_columns = []

        for col in dict_columns:
            exploded = pd.json_normalize(df[col]).add_prefix(f'{col}.')
            exploded.index = df.index
            df = pd.concat([df, exploded], axis=1).drop(columns=[col])
            new_columns.extend(exploded.columns)  # inplace

        for col in list_columns:
            # print(f"exploding: {col}")
            df = df.drop(columns=[col]).join(df[col].explode().to_frame())
            new_columns.append(col)

        s = (df[new_columns].applymap(type) == list).all()
        list_columns = s[s].index.tolist()

        s = (df[new_columns].applymap(type) == dict).all()
        dict_columns = s[s].index.tolist()
    return df

那就做吧

flatten_nested_json_df(df)

它应该会给你你所期望的。
如果您有2个 Dataframe ,df1(您要展平)和df2要合并,请对df1执行相同的操作,然后:

df_final = df1.merge(df2, on = ['id'])

相关问题