代码之家  ›  专栏  ›  技术社区  ›  swifty

熊猫-pd。合并,添加检查以确保列不存在?

  •  2
  • swifty  · 技术社区  · 8 年前

    我有两个数据帧,一个是我使用的主数据帧,另一个是我想从中获取信息的辅助数据帧。

    df1 (main)包含具有各种名称字符串的报告器列。

    df2 (附加信息)包含报告者姓名及其位置。

    我希望在中添加位置列作为新列 df1 .

    我可以一次性完成以下工作:

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

    而且很有效。

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

    • 只检查列是否存在的问题是,df中可能添加了一个新行(包含一个新的报告器名称),我确实想知道/更新它的位置。

    • 我这样做对吗?或者我应该做一些dict查找,每次都有条件地映射位置吗?我怎样才能在熊猫身上做到这一点?

    3 回复  |  直到 8 年前
        1
  •  1
  •   jpp    8 年前

    问题在于 pd.merge 它总是在结果中添加后缀。

    不要用它。

    使用等效的 DataFrame.join DataFrame.merge 在你正在做的左边连接的那个。

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

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

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

        2
  •  1
  •   cs95 abhishek58g    8 年前

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

    注意:我想你已经申请了 str 根据需要转换为所有列。

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

    一般来说,没有必要将您的系列转换为 dict 或用于 zip 在…上 pd.Series 物体。使用 拉链 具有 numpy 阵列 can be inefficient .

        3
  •  0
  •   swifty    8 年前

    感谢您提供的信息coldspeed,但我选择了第二个选项,映射dict。

    reporter_dict = dict(zip(df2['Reporter'].astype(str),df2['Reporter Location']))
    df['Reporter Location'] = df['Reporter'].astype(str).map(reporter_dict)