Pandas加入/合并/连接两个DataFrame并组合相同键/索引的行

J. *_*Day 5 python merge join dataframe pandas

我正在尝试组合两组数据,但是我无法确定哪种方法最合适(连接,合并,连接等)这个应用程序,并且文档没有任何示例可以做我需要的去做.

我有两组数据,结构如下:

>>> A
Time     Voltage
1.0      5.1
2.0      5.5
3.0      5.3
4.0      5.4
5.0      5.0

>>> B
Time     Current
-1.0     0.5
0.0      0.6
1.0      0.3
2.0      0.4
3.0      0.7
Run Code Online (Sandbox Code Playgroud)

我想组合数据列并将"时间"列合并在一起,以便获得以下内容:

>>> AB
Time     Voltage     Current
-1.0                 0.5
0.0                  0.6
1.0      5.1         0.3
2.0      5.5         0.4
3.0      5.3         0.7
4.0      5.4            
5.0      5.0            
Run Code Online (Sandbox Code Playgroud)

我已经尝试过AB = merge_ordered(A, B, on='Time', how='outer'),虽然它成功地组合了数据,但它输出类似于:

>>> AB
Time     Voltage     Current
-1.0                 0.5
0.0                  0.6
1.0      5.1            
1.0                  0.3
2.0      5.5            
2.0                  0.4
3.0      5.3            
3.0                  0.7
4.0      5.4            
5.0      5.0            
Run Code Online (Sandbox Code Playgroud)

您会注意到它没有将行与共享的"时间"值组合在一起.

我也试过合并一个la AB = A.merge(B, on='Time', how='outer'),但是输出的东西组合在一起,但没有排序,就像这样:

>>> AB
Time     Voltage     Current
-1.0                 0.5
0.0                  0.6
1.0      5.1            
2.0      5.5            
3.0      5.3         0.7
4.0      5.4            
5.0      5.0            
1.0                  0.3
2.0                  0.4
Run Code Online (Sandbox Code Playgroud)

...它基本上会跳过"当前"中的一些数据并将其附加到底部,但它的确不一致.而且,它不会将行合并在一起.

尝试过AB = pandas.concat(A, B, axis=1),但结果没有合并.我只是得到了两个DataFrame的串联,如下所示:

>>> AB
Time     Voltage     Time     Current
1.0      5.1         -1.0     0.5
2.0      5.5         0.0      0.6
3.0      5.3         1.0      0.3
4.0      5.4         2.0      0.4
5.0      5.0         3.0      0.7
Run Code Online (Sandbox Code Playgroud)

我一直在搜索文档,并在这里尝试找出merge和之间的确切差异join,但从我收集到的它们非常相似.尽管如此,我还没有找到任何具体回答"如何合并共享相同键/索引的行"的问题.任何人都可以告诉我如何做到这一点?我只有几天的熊猫经验!

piR*_*red 6

merge
merge在列上结合.默认情况下,它采用所有通常命名的列.否则,您可以指定要组合的列.在这个例子中,我选择了,Time.

A.merge(B, 'outer', 'Time')

   Time  Voltage  Current
0   1.0      5.1      0.3
1   2.0      5.5      0.4
2   3.0      5.3      0.7
3   4.0      5.4      NaN
4   5.0      5.0      NaN
5  -1.0      NaN      0.5
6   0.0      NaN      0.6
Run Code Online (Sandbox Code Playgroud)

join
join除非您指定左侧的列,否则将对索引值进行组合.这就是为什么我设置右侧的索引和指定左侧的列Time.

A.join(B.set_index('Time'), 'Time', 'outer')

   Time  Voltage  Current
0   1.0      5.1      0.3
1   2.0      5.5      0.4
2   3.0      5.3      0.7
3   4.0      5.4      NaN
4   5.0      5.0      NaN
4  -1.0      NaN      0.5
4   0.0      NaN      0.6    ?
Run Code Online (Sandbox Code Playgroud)

pd.concat
concat结合索引值...所以我创建了一个列表推导,我在其中迭代我想要组合的每个数据帧[A, B].在理解中,每个数据帧都假定名称d,因此for d in [A, B]. axis=1说将它们并排组合使用索引作为连接特征.

pd.concat([d.set_index('Time') for d in [A, B]], axis=1).reset_index()

   Time  Voltage  Current
0  -1.0      NaN      0.5
1   0.0      NaN      0.6
2   1.0      5.1      0.3
3   2.0      5.5      0.4
4   3.0      5.3      0.7
5   4.0      5.4      NaN
6   5.0      5.0      NaN
Run Code Online (Sandbox Code Playgroud)

combine_first

A.set_index('Time').combine_first(B.set_index('Time')).reset_index()

   Time  Current  Voltage
0  -1.0      0.5      NaN
1   0.0      0.6      NaN
2   1.0      0.3      5.1
3   2.0      0.4      5.5
4   3.0      0.7      5.3
5   4.0      NaN      5.4
6   5.0      NaN      5.0
Run Code Online (Sandbox Code Playgroud)