将自定义函数应用于熊猫 数据帧返回'DataFrame'对象不可调用



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)

它对我很有效。

最新更新