【发布时间】:2019-04-05 16:13:03
【问题描述】:
我可能忽略了一个简单的数据问题,但在合并数据帧时无法获得所需的结果。 从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
两个数据框中的关键是“时间”,所以这也不是问题。 任何人都知道这里发生了什么?
【问题讨论】:
-
您在问题中混合了不同的
how(第一个示例使用right,第二个示例使用outer),请更新并保持一致。另外,请根据您的输入提交预期输出示例。 -
我已经编辑了帖子并包含了我的预期结果
-
您的预期结果与您输入的数据不匹配。例如:
Time是12时,B应该是NaN。 -
我已经编辑了我的问题并为时间为 12 添加了一行,因为这是一个具有 9000 个值或其他内容的数据框(对于时间 1-9000,增量为 1,因此所有整数都在有时间)
-
好的,然后
pd.merge(df1, df2, how="outer", on="Time")给我你的预期输出。
标签: python pandas dataframe merge