我有两个数据帧。第一个是电子邮件地址列表
email_ad Band 30 Band 40
example_email@gmail.com
sample_email@gmail.com
第二个是以下数据帧
email_ad Name Manager_Name Manager_Band_level
example_email@gmail.com. Tom Banks Boss1 30
sample_email@gmail.com. Bill Bob Boss2 40
我想将第一个数据框中的每个电子邮件映射到第二个数据框中,如果电子邮件匹配,则检查Manager Band级别。根据数字,将相应经理的电子邮件填写到“等级30”或“等级40”类别中。
因此所需的数据帧如下:
email_ad Band 30 Band 40
example_email@gmail.com Boss1
sample_email@gmail.com. Boss2
如果有人可以帮助我提供惊人的语法。我还被困在仅根据数据框中的某些列制作字典。非常感谢!
答案 0 :(得分:2)
您可以使用枢轴执行此操作。
pivoted = df.pivot('email_ad', 'Manager_Band_level', 'Manager_Name')
pivoted
# Manager_Band_level 30 40
# email_ad
# example_email@gmail.com Boss1 NaN
# sample_email@gmail.com NaN Boss2
该格式可能仍然可用。但是,如果您想对其进行更多清理,则可以填写缺少的值,然后将其展平。
cleaned = pivoted.fillna('').reset_index()
cleaned
# Manager_Band_level email_ad 30 40
# 0 example_email@gmail.com Boss1
# 1 sample_email@gmail.com Boss2
您可以通过重置columns
来摆脱笨拙的,现在不正确的列索引名称。
cleaned.columns = list(cleaned.columns)
cleaned
# email_ad 30 40
# 0 example_email@gmail.com Boss1
# 1 sample_email@gmail.com Boss2
如果Band
前缀很重要,则可以同时添加。
cleaned.columns = [col if col == 'email_ad' else f'Band {col}' for col in cleaned.columns]
cleaned
# email_ad Band 30 Band 40
# 0 example_email@gmail.com Boss1
# 1 sample_email@gmail.com Boss2
答案 1 :(得分:0)
尝试使用合并,如果有多个频段,则可能会循环:
import pandas as pd
from io import StringIO
s1 = '''
email_ad,Band 30,Band 40
example_email@gmail.com,,
sample_email@gmail.com,,
'''
s2= '''
email_ad,Name,Manager_Name,Manager_Band_level
example_email@gmail.com,Tom Banks,Boss1,30
sample_email@gmail.com,Bill Bob,Boss2,40
'''
df1 = pd.read_csv(StringIO(s1))
df2 = pd.read_csv(StringIO(s2))
然后进行合并
df3 = df1.merge(df2, how='left', left_on='email_ad', right_on='email_ad')
for i in (30,40):
df3.loc[df3.Manager_Band_level == i, f'Band {i}'] = \
df3.loc[df3.Manager_Band_level == i, 'Manager_Name']
df3[['email_ad', 'Band 30', 'Band 40']]
# email_ad Band 30 Band 40
# 0 example_email@gmail.com Boss1 NaN
# 1 sample_email@gmail.com NaN Boss2