我有两个数据框,一个是我使用的主要数据框,另一个是我希望从中提供信息的辅助数据框。
df2
(main)包含一个包含各种名称字符串的Reporter列。
df1
(附加信息)包含记者姓名及其位置。
我希望将位置列添加为df1 = pd.merge(df1, df2, on='Reporter', how='left')
中的新列。
我可以通过以下方式完成以下任务:
{{1}}
并且有效。
我的问题是我运行一个经常更新的脚本(检查新行并检查旧行的更新)并重复运行这行代码,为每次执行添加多列。
仅检查列是否存在的问题是可能已将新行(包含新的记者名称)添加到我想知道/更新位置的df中。
我是以正确的方式来做这件事的吗?或者我应该进行某种字典查找并每次有条件地映射该位置?我怎么能在熊猫中做到这一点?
答案 0 :(得分:1)
pd.merge
的问题是它总是为结果添加后缀。
请勿使用。
在你正在进行LEFT JOIN的那个上使用等效的DataFrame.join
或DataFrame.merge
。
df1 = df1.join(df2, on='Reporter', how='left')
或者,
df1 = df1.merge(df2, on='Reporter', how='left')
公共列仅在结果中保留一次。但是,两者之间的其他相同列(如果有的话)是重复的(带有后缀)。
答案 1 :(得分:1)
对于单个系列,我通常更喜欢映射系列,而不是merge
或join
(如果使用正确,也都是有效选项)。
注意我假设您已根据需要将str
转换应用于所有列。
s = df2.set_index('Reporter')['Reporter Location']
df['Reporter Location'] = df['Reporter'].map(s)
通常,您无需将系列转换为dict
或在zip
对象上使用pd.Series
。将zip
与numpy
数组can be inefficient一起使用。
答案 2 :(得分:0)
感谢信息coldspeed,但我选择了第二个选项,映射字典。
reporter_dict = dict(zip(df2['Reporter'].astype(str),df2['Reporter Location']))
df['Reporter Location'] = df['Reporter'].astype(str).map(reporter_dict)