Pandas - pd.merge,添加一项检查以确保列不存在?

时间:2018-06-05 02:31:04

标签: python pandas dataframe

我有两个数据框,一个是我使用的主要数据框,另一个是我希望从中提供信息的辅助数据框。

df2(main)包含一个包含各种名称字符串的Reporter列。

df1(附加信息)包含记者姓名及其位置。

我希望将位置列添加为df1 = pd.merge(df1, df2, on='Reporter', how='left') 中的新列。

我可以通过以下方式完成以下任务:

{{1}}

并且有效。

我的问题是我运行一个经常更新的脚本(检查新行并检查旧行的更新)并重复运行这行代码,为每次执行添加多列。

  • 仅检查列是否存在的问题是可能已将新行(包含新的记者名称)添加到我想知道/更新位置的df中。

  • 我是以正确的方式来做这件事的吗?或者我应该进行某种字典查找并每次有条件地映射该位置?我怎么能在熊猫中做到这一点?

3 个答案:

答案 0 :(得分:1)

pd.merge的问题是它总是为结果添加后缀。

请勿使用。

在你正在进行LEFT JOIN的那个上使用等效的DataFrame.joinDataFrame.merge

df1 = df1.join(df2, on='Reporter', how='left')

或者,

df1 = df1.merge(df2, on='Reporter', how='left')

公共列仅在结果中保留一次。但是,两者之间的其他相同列(如果有的话)是重复的(带有后缀)。

答案 1 :(得分:1)

对于单个系列,我通常更喜欢映射系列,而不是mergejoin(如果使用正确,也都是有效选项)。

注意我假设您已根据需要将str转换应用于所有列。

s = df2.set_index('Reporter')['Reporter Location']

df['Reporter Location'] = df['Reporter'].map(s)

通常,您无需将系列转换为dict或在zip对象上使用pd.Series。将zipnumpy数组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)