【问题标题】:duplication on combining 2 pandas dataframes组合2个熊猫数据框的重复
【发布时间】:2018-07-18 10:37:59
【问题描述】:

我试图理解为什么合并函数会重复值。

>>> c2.head()
Out[42]:                  
Bin        Date/Time       val         
A    10/31/2017 15:53:57   0.77
A    10/31/2017 15:53:57   0.75
A    10/31/2017 15:53:57   0.79
A    10/31/2017 15:53:57   0.67
A    10/31/2017 15:53:57   0.72

>>> c1.head()
Out[44]: 
  Bin   Date/Time          code
  A  10/31/2017 15:53:57   BYM
  A  10/31/2017 15:53:57   CFS
  A  10/31/2017 15:53:57   DFZ
  A  10/31/2017 15:53:57   HKN
  A  10/31/2017 15:53:57   RBF

我需要在 Bin 和 Datetime 上合并这 2 个。

>>> c= c1.merge(c2, on =['Bin','Date/Time'], how= 'left')

>>> c.head()
Out[50]: 
  Bin       Date/Time      Code  Val
  A  10/31/2017 15:53:57   BYM   0.77
  A  10/31/2017 15:53:57   BYM   0.77
  A  10/31/2017 15:53:57   BYM   0.77
  A  10/31/2017 15:53:57   BYM   0.77
  A  10/31/2017 15:53:57   BYM   0.77

所以 c 对于同一个 bin/datetime 有多个条目。我认为也许日期时间值看起来相同但不同。但事实并非如此。

>>> c1['Date/Time'].iloc[0]
Out[46]: u'10/31/2017 15:53:57'
>>> c2['Date/Time'].iloc[0]
Out[47]: u'10/31/2017 15:53:57'
>>> c1['Date/Time'].iloc[0]==c2['Date/Time'].iloc[0]
Out[48]: True

此外,即使 datetime 不同,每个 bin/datetime 也应该只有 2 行。知道这里可能会发生什么吗?

我的预期输出是:

  Bin       Date/Time      Code  Val
  A  10/31/2017 15:53:57   BYM   0.77
  A  10/31/2017 15:53:57   CFS   0.75
  A  10/31/2017 15:53:57   DFZ   0.79
  A  10/31/2017 15:53:57   HKN   0.67
  A  10/31/2017 15:53:57   RBF   0.72

【问题讨论】:

  • 您的预期输出是什么? c1c2 的行数是否相同,您只想将 val 列从 c2 添加到 c1
  • @jp_data_analysis 添加了预期输出
  • 你试过了吗:c1['Val'] = c2['Val']
  • 如果以下答案之一有帮助,请随时接受(在左侧打勾),以便其他用户可以看到经过测试的解决方案。

标签: python pandas dataframe merge duplicates


【解决方案1】:

由于vals 在c2 中的唯一性,会发生重复值。

简化示例:

>>> c1.head(1)
  Bin           Date/Time code
0   A 2017-10-31 15:53:57  BYM

将这 1 行与 c2 合并:

>>> c1.head(1).merge(c2, on=['Bin','Date/Time'], how='left')
  Bin           Date/Time code   val
0   A 2017-10-31 15:53:57  BYM  0.77
1   A 2017-10-31 15:53:57  BYM  0.75
2   A 2017-10-31 15:53:57  BYM  0.79
3   A 2017-10-31 15:53:57  BYM  0.67
4   A 2017-10-31 15:53:57  BYM  0.72

您正在合并两个键 ['Bin','Date/Time'],对于 c1 中的每个 code,它会从 c2 中引入每个唯一的 val

【讨论】:

  • 感谢@Jarad。有没有办法获得我上面提到的预期输出?
【解决方案2】:

看来您不需要合并。如果 2 个数据帧具有相同的大小和索引,那么您可以简单地将一个系列分配给另一个:

c1.val = c2.val

有时,您可能希望跨多个系列从一个数据帧复制到另一个数据帧。这可以通过combine_first 来实现,而不是循环多个列:

c1.combine_first(c2)

在常见索引的情况下,这将优先考虑 c1,但如果唯一的区别是一个数据帧有一个额外的列,则无关紧要。

如果索引不同,您可能希望在上述任一方法之前通过.reset_index() 重新对齐它们。

【讨论】:

    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2018-09-13
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多