组合2个pandas数据帧时重复

时间:2018-02-08 00:38:02

标签: python pandas dataframe merge duplicates

我试图理解为什么合并功能会复制值。

>>> 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上合并这两个。

>>> 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

此外,即使日期时间不同,每个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

2 个答案:

答案 0 :(得分:1)

由于val中的唯一c2,会发生重复值。

简化示例:

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

将这一行合并到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

答案 1 :(得分:0)

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

c1.val = c2.val

有时,您可能希望将多个系列从一个数据框复制到另一个数据框。这可以通过combine_first

实现,而不是循环遍历多个列
c1.combine_first(c2)

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

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