python-3.x 高效地替换panda dict中dict列的列值

btxsgosb  于 2022-12-20  发布在  Python
关注(0)|答案(2)|浏览(171)

我想帮助矢量化我当前的代码,任何帮助或评论是appreciated我有一个df与一个奇怪的列,是从一个可用性检查器函数,如下图所示:

original_df = pd.DataFrame({
    'a':['a1', 'a2', 'a3', 'a4'],
    'b':['b1', 'b20', 'b98', 'b4'],
    'c':[{'a':'not_available', 'b': 'b1'}, {}, {'a':'a3', 'b': 'b98'}, {'a':'not_available', 'b': 'not_available'}],
})

| 项目a| b.人口基金|(c)秘书长的报告|
| - ------| - ------| - ------|
| a1| b1|第一个月|
| a2|硼20| {}|
| a3| b98| {'a': 'a3', 'b': 'b98'}|
| a4| b4| {'a': 'not_available', 'b': 'not_available'}|
我想基于列c的字典来转换列ab。因此,得到的DF看起来像这样:

desired_df = pd.DataFrame({
    'a':['not_available', 'a2', 'a3', 'not_available'],
    'b':['b1', 'b20', 'b98', 'not_available']})

| 项目a| b.人口基金|
| - ------| - ------|
| 不可用|b1|
| a2|硼20|
| a3| b98|
| 不可用|不可用|
注意事项:如果c列中的dict为空,则保留其他列中的值。c的dict中的值只能是其他列或not_available中的当前值。

for idx, row in original_df.iterrows():
    for key, value in row.c.items():
        original_df.loc[idx, key] = value

这是一个下采样场景,dict包含8列,df通常有20 - 60行。
这是我当前的代码,它可以工作,但速度非常慢。这段代码用在一个API中,我的分析器告诉我,这个函数消耗的累积时间最长。这是有意义的,因为我正在迭代所有的东西,我希望得到一些帮助!
Shubams的答案已经让这个函数从20秒变成了0. 208秒,谢谢!

q1qsirdb

q1qsirdb1#

根据列c中的指令创建中间 Dataframe ,然后屏蔽不等于not_available的值,并使用fillna填充原始df中的空值

out = pd.DataFrame([*original_df['c']], original_df.index)
out = out[out == 'not_available'].fillna(original_df)
print(out)
               a              b
0  not_available             b1
1             a2            b20
2             a3            b98
3  not_available  not_available
t9eec4r0

t9eec4r02#

dict_series = original_df[['a', 'b']].apply(lambda x: dict(x), axis=1)
s = original_df['c']
out = s.where(s.astype(bool), dict_series).apply(lambda x: pd.Series(x))

第一个月

a               b
0   not_available   b1
1   a2              b20
2   a3              b98
3   not_available   not_available

相关问题