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



我可能忽略了一个简单的数据问题,但在合并数据帧时,我很难获得所需的结果。根据这里列出的文档,如果键值不在其中一个数据帧中,我希望键列中的所有值都出现在与NaN值合并的结果中;

如果组合键没有出现在左侧或右侧表,联接表中的值将是NA

但是,我只获取数据的两个数据帧中存在的键的值。我使用了outer,也尝试了left(left是键列中有更多值的数据帧(。当我用样本数据(为这个问题创建(尝试它时,它似乎在某种程度上起作用!

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

关键是两个数据帧中的"时间",所以这也不是问题所在。有人知道这里发生了什么吗?

我觉得很愚蠢,但这与排序有关。它一直按预期工作,但我未能在"Time"上正确地对合并的数据帧进行排序,因此,在打印合并数据帧时,不在初始帧中的Time值的行没有显示。对打印中的合并帧进行排序显示预期输出

print(dfMerged.sort_values('Time'))

最新更新