【问题标题】: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 中未出现在映射中的值保持不变。

标签: python pandas dataframe dictionary mapping


【解决方案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

【讨论】:

  • 你是最棒的!
猜你喜欢
  • 2019-01-15
  • 2022-01-27
  • 2021-05-27
  • 2023-01-19
  • 2012-12-21
  • 2022-11-18
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多