合并数据框会产生意外结果

时间:2018-11-01 12:26:05

标签: python pandas dataframe merge

我可能忽略了一个简单的数据问题,但是在合并数据帧时无法获得所需的结果。 如果列出的数据here中没有文档之一,则我希望键列中的所有值都与NaN值一起出现在合并结果中。

  

如果左侧或右侧均未出现组合键   表,联接表中的值将为NA

但是,我只获得在两个数据框中都存在的键值。我正在使用外部并且还尝试了左(左是在键列中具有更多值的数据框)。 当我尝试使用示例数据(针对此问题创建)时,它似乎可以工作!

import pandas as pd import numpy as np

df1 = pd.DataFrame({'A': np.random.randint(0,10, size=(10,)),
                   'Time': np.random.randint(0,10, size=(10,))}) df1 = df1.sort_values('Time')

masterTime = [None]*len(df1) for x in range(len(df1)):
    masterTime[x] = x+1

df2 = pd.DataFrame({'Time': masterTime,
                    'B': np.random.randint(0,10,size=(10,))}) 
dfMerged = pd.merge(df1, df2,how='outer',on='Time') 
print(df1) 
print(df2) 
print(dfMerged)

此行为符合预期:

   A  Time
5  3     0
8  2     0
9  5     0
1  8     2
7  5     4
6  7     5
3  3     6
4  7     6
2  4     7
0  5     9
   Time  B
0     1  1
1     2  8
2     3  9
3     4  1
4     5  5
5     6  0
6     7  9
7     8  6
8     9  1
9    10  6
       A  Time    B
0   0.0     0  NaN
1   9.0     0  NaN
2   8.0     0  NaN
3   2.0     2  5.0
4   4.0     2  5.0
5   9.0     4  2.0
6   0.0     6  8.0
7   9.0     6  8.0
8   8.0     7  1.0
9   5.0     8  6.0
10  NaN     1  8.0
11  NaN     3  5.0
12  NaN     5  4.0
13  NaN     9  9.0
14  NaN    10  2.0

但是对于我的源数据,这将产生以下结果:

df1:

      Time              A              C
0        0      80.332192     136.548522
1        3     100.825094     201.764747
2        5      83.776422     157.963083
3        7      96.326057     207.776248
4        7      98.632962     139.496500
5        8     102.935885     147.342966
6        9      99.895678     167.848140
7       10      77.258792     131.287188
8       10      79.845595     135.395080
9       11      97.838232     192.865211
10      12      78.505035     149.080378

df2

      Time        B
0        1  1000.12
1        2  1000.12
2        3  1000.12
3        4  1000.12
4        5  1000.12
5        6  1000.12
6        7  1000.12
7        8  1000.12
8        9  1000.12
9       10  1000.12
10      11  1000.12
11      12  1000.12  

(两个数据帧都像这样继续)

将这些与how ='outer'和on ='Time'合并会给我输出:

       Time              A              C        B
0         0      80.332192     136.548522      NaN
1         3     100.825094     201.764747  1000.12
2         5      83.776422     157.963083  1000.12
3         7      96.326057     207.776248  1000.12
4         7      98.632962     139.496500  1000.12
5         8     102.935885     147.342966  1000.12
6         9      99.895678     167.848140  1000.12
7        10      77.258792     131.287188  1000.12
8        10      79.845595     135.395080  1000.12
9        11      97.838232     192.865211  1000.12
10       12      78.505035     149.080378  1000.12

您可以看到这些只是df1中的值。不管我尝试向左,向右,内部还是外部,它总是会给我这些(只是不同之处在于它是否会给我0值,具体取决于方法) 我期望像这样(与上面的示例输出一致)

       Time              A              C        B
0         0      80.332192     136.548522      NaN
1         1            NaN            NaN  1000.12
2         2            NaN            NaN  1000.12
3         3     100.825094     201.764747  1000.12
4         4            NaN            NaN  1000.12
5         5      83.776422     157.963083  1000.12
6         6            NaN            NaN  1000.12 
7         7      96.326057     207.776248  1000.12
8         7      98.632962     139.496500  1000.12
9         8     102.935885     147.342966  1000.12
10        9      99.895678     167.848140  1000.12
11       10      77.258792     131.287188  1000.12
12       10      79.845595     135.395080  1000.12
13       11      97.838232     192.865211  1000.12
14       12      78.505035     149.080378  1000.12

两个数据帧中的键均为“时间”,因此也不是问题。 有人对这里发生的事情有任何线索吗?

1 个答案:

答案 0 :(得分:0)

我觉得自己很愚蠢,但这与排序有关。一直以来,它都按预期工作,但是我无法正确地对“时间”上的合并数据帧进行排序,因此在打印合并数据帧时未显示初始帧中未包含的“时间”值行。 对打印中的合并帧进行排序显示了预期的输出

print(dfMerged.sort_values('Time'))