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