在给定“映射数据框”的情况下爆炸熊猫数据框的行
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
【讨论】:
你是最棒的!以上是关于在给定“映射数据框”的情况下爆炸熊猫数据框的行的主要内容,如果未能解决你的问题,请参考以下文章