我正在尝试将主 Dataframe 与从另一个 Dataframe 中提取的嵌套dict连接起来主 Dataframe
摘录的词典
预期结果
这是我试过的
x = pd.concat([df, pd.get_dummies(genres['name'])], axis=1)
x
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
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'])
2条答案
按热度按时间jobtbby31#
IIUC,您可以使用:
输入数据:
yiytaume2#
如果我没理解错的话,你只有一个 Dataframe df,你刚刚分解了一列包括流派的数据,并试图将它合并回原始的 Dataframe 。在这种情况下,你不需要这样做。只要使用这个函数。它会填充整个 Dataframe 。
那就做吧
它应该会给你你所期望的。
如果您有2个 Dataframe ,df1(您要展平)和df2要合并,请对df1执行相同的操作,然后: