Hej,
我在这里的第一篇帖子。我试图在这里找到类似的问题,但没有成功。它来了。我有几个独立的Panda DataFrames,其中至少有一列包含字典,即
fiscalYear | prodID | position
2020 | 123 | {'description': 'Customer Operations', 'code': '51254185'}
2020 | 456 | {'description': 'Support', 'code': '50544654'}
...
我可以用以下方法将字典列转换为两列(或更多):
position_df['position'] = main_df['position'].apply(lambda x: dict(eval(x)))
position_df = position_df['position'].apply(pd.Series)
position_df.rename(columns={'des': 'position_name', 'code':'positionID'},inplace=True)
result = pd.concat([main_df, position_df], axis=1, join="inner")
所以我得到
fiscalYear| prodID| position | position_name | posID
2020 | 123 | {'des': 'Customer Operations', 'code': '51254185'} | 'Customer Operations' | 51254185
2020 | 456 | {'des': 'Support', 'code': '50544654'} | 'Support', | 50544654
...
我创建了自定义函数,只更改了输入,但我得到了TypeError:"DataFrame"对象不可调用
这是我的功能和呼叫
def dictionary_to_columns(dic_column,rename_col,df):
temp_df = pd.DataFrame()
# todo: # of items in the dictionary in dic_column
temp_df['temporary'] = df[dic_column].apply(lambda x: dict(eval(x)))
temp_df = temp_df['temporary'].apply(pd.Series)
temp_df.rename(columns=rename_col,inplace=True)
result = pd.concat([df, temp_df], axis=1, join="inner")
return result
main_df['position'] = main_df['position'].apply(dictionary_to_columns('position',{'des': 'name', 'code':'ID'},main_df))
我想我明白了return语句中的错误。我在返回前打印了前5行,看起来不错。有什么建议吗?
将dict解包成列就像从apply
:返回一个序列一样简单
df
fiscalYear prodID position
0 2020 123 {'description': 'Customer Operations', 'code':...
1 2020 456 {'description': 'Support', 'code': '50544654'}
df[['name', 'ID']] = df.apply(lambda row: pd.Series(row['position']), axis=1)
df
fiscalYear prodID position name ID
0 2020 123 {'description': 'Customer Operations', 'code':... Customer Operations 51254185
1 2020 456 {'description': 'Support', 'code': '50544654'} Support 50544654
当我找到解决方案时,我决定回答自己的问题。也许其他人会使用它。
根据@Joran关于我返回DataFrame的建议/建议,我将函数更改为:
def dictionary_to_columns(dic_column, rename_col, df):
temp_df = pd.DataFrame()
# todo: # of items in the dictionary in dic_column
temp_df['temporary'] = df[dic_column].apply(lambda x: dict(eval(x)))
temp_df = temp_df['temporary'].apply(pd.Series)
temp_df.rename(columns=rename_col, inplace=True)
df = pd.concat([df, temp_df], axis=1, join="inner")
我改变了原始DataFrame,而不是分配给结果变量并返回。我认为最重要的是改变我称之为的方式
dictionary_to_columns('position',{'des': 'name', 'code':'ID'},main_df)
它对我很有效。