在给定“映射数据框”的情况下爆炸熊猫数据框的行

Posted

技术标签:

【中文标题】在给定“映射数据框”的情况下爆炸熊猫数据框的行【英文标题】:Exploding rows of a pandas dataframe given a 'mapping dataframe' 【发布时间】:2021-08-20 16:21:52 【问题描述】:

我必须使用数据框。我需要对数据框 A 执行操作。它看起来像这样:

name score
alpha 16
beta 12
gamma 24
delta 16

第二个数据帧 B 是一个映射。

name_in name_out weight
beta beta_1 0.5
beta beta_2 0.3
beta beta_3 0.2
omega omega_1 0.9
omega omega_2 0.1

如果我在数据帧 A 上执行映射,我需要以下结果:

name score
alpha 16
beta_1 6
beta_2 3.6
beta_3 2.4
gamma 24
delta 16

因此,从概念上讲,我需要一个算法来检查名称是否出现在映射数据框中。如果是这样,我需要为映射中存在的许多值复制该行。另外,我需要将重复的分数乘以映射的权重。

在给定映射的情况下,该过程基本上增加了详细程度。

【问题讨论】:

为什么输出表中的'alpha'是14?它没有出现在映射表中。 是一个错字,感谢您通知我。数据框 A 中未出现在映射中的值保持不变。 【参考方案1】:

一种选择是使用merge 后跟fillna 来填写缺失值:

# Merge Tables Together
new_df = df_a.merge(df_b, left_on='name', right_on='name_in', how='left')

# Fillna with Name
new_df['name_out'] = new_df['name_out'].fillna(new_df['name'])
# Calculate Scores and fillna
new_df['weight'] = (new_df['weight'] * new_df['score']).fillna(new_df['score'])

# Cleanup columns
new_df = (
    new_df.drop(columns=['name', 'score', 'name_in'])
        .rename(columns='name_out': 'name', 'weight': 'score')
)

new_df:

     name  score
0   alpha   16.0
1  beta_1    6.0
2  beta_2    3.6
3  beta_3    2.4
4   gamma   24.0
5   delta   16.0

【讨论】:

你是最棒的!

以上是关于在给定“映射数据框”的情况下爆炸熊猫数据框的行的主要内容,如果未能解决你的问题,请参考以下文章

爆炸熊猫数据框列

Python熊猫:爆炸多行

熊猫爆炸失败,KeyError:0

熊猫如何为每个新行爆炸几个列表项

如何在熊猫数据框的行之间应用多个条件创建目标数据框

如何在熊猫中做“横向视图爆炸()”[重复]