在给定 'mapping dataframe' 的情况下分解 pandas 数据框的行
Exploding rows of a pandas dataframe given a 'mapping dataframe'
我必须数据帧。我需要对数据帧 A 执行操作。它看起来像这样:
姓名
得分
阿尔法
16
测试版
12
伽玛
24
增量
16
第二个数据帧 B 是一个映射。
name_in
name_out
体重
测试版
beta_1
0.5
测试版
beta_2
0.3
测试版
beta_3
0.2
欧米茄
omega_1
0.9
欧米茄
omega_2
0.1
如果我在数据帧 A 上执行映射,我需要以下结果:
姓名
得分
阿尔法
16
beta_1
6
beta_2
3.6
beta_3
2.4
伽玛
24
增量
16
因此,从概念上讲,我需要一种算法来检查名称是否出现在映射数据框中。如果是这样,我需要为映射中存在的值复制行。另外,我需要将重复的分数乘以映射的权重。
根据映射,该过程基本上增加了一个细节级别。
一种选择是使用 merge
followed by 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
我必须数据帧。我需要对数据帧 A 执行操作。它看起来像这样:
姓名 | 得分 |
---|---|
阿尔法 | 16 |
测试版 | 12 |
伽玛 | 24 |
增量 | 16 |
第二个数据帧 B 是一个映射。
name_in | name_out | 体重 |
---|---|---|
测试版 | beta_1 | 0.5 |
测试版 | beta_2 | 0.3 |
测试版 | beta_3 | 0.2 |
欧米茄 | omega_1 | 0.9 |
欧米茄 | omega_2 | 0.1 |
如果我在数据帧 A 上执行映射,我需要以下结果:
姓名 | 得分 |
---|---|
阿尔法 | 16 |
beta_1 | 6 |
beta_2 | 3.6 |
beta_3 | 2.4 |
伽玛 | 24 |
增量 | 16 |
因此,从概念上讲,我需要一种算法来检查名称是否出现在映射数据框中。如果是这样,我需要为映射中存在的值复制行。另外,我需要将重复的分数乘以映射的权重。
根据映射,该过程基本上增加了一个细节级别。
一种选择是使用 merge
followed by 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