使用 Pandas 将两个数据框进行列绑定(cbind)。

89

我有一个包含id信息的数据框df_a

    unique_id lacet_number
15    5570613  TLA-0138365
24    5025490  EMP-0138757
36    4354431  DXN-0025343

还有另一个数据框 df_b,行数与我知道对应于df_a中的行数相同:

     latitude  longitude
0  -93.193560  31.217029
1  -93.948082  35.360874
2 -103.131508  37.787609
我想做的就是将这两个水平拼接在一起(类似于R中的cbind),得到如下结果:
    unique_id lacet_number      latitude  longitude
0     5570613  TLA-0138365    -93.193560  31.217029
1     5025490  EMP-0138757    -93.948082  35.360874
2     4354431  DXN-0025343   -103.131508  37.787609

我尝试过的:

df_c = pd.concat([df_a, df_b], axis=1)

这使我得到了一个外连接。

    unique_id lacet_number    latitude  longitude
0         NaN          NaN  -93.193560  31.217029
1         NaN          NaN  -93.948082  35.360874
2         NaN          NaN -103.131508  37.787609
15    5570613  TLA-0138365         NaN        NaN
24    5025490  EMP-0138757         NaN        NaN
36    4354431  DXN-0025343         NaN        NaN

问题在于两个数据帧的索引不匹配。我阅读了pandas.concat 的文档,并看到有一个 ignore_index 选项。但这只适用于连接轴,而我这里是行,所以这肯定不是正确的选择。那么我的问题是:有没有简单的方法可以解决这个问题?


应该提到cbind()是一个R函数,它通过列(pd.concat(..., axis=1))来连接数据框和/或序列('向量')。然而,pandas的concat()尝试对齐索引,而R的cbind()则忽略它们。 - undefined
3个回答

138

如果您确定索引行的值相同,那么为了避免索引对齐顺序,只需调用reset_index(),这将重置您的索引值以从0开始:

df_c = pd.concat([df_a.reset_index(drop=True), df_b], axis=1)

5

DataFrame.join

虽然 concat 可以使用,但更简单的方法是使用 join 函数:

C = A.join(B)

这仍然假定索引对齐,因此需要根据需要reset_index。在OP的示例中,B的索引已经是默认的,因此我们只需要重置A
C = A.reset_index(drop=True).join(B)

#    unique_id  lacet_number     latitude  longitude
# 0    5570613   TLA-0138365   -93.193560  31.217029
# 1    5025490   EMP-0138757   -93.948082  35.360874
# 2    4354431   DXN-0025343  -103.131508  37.787609

1
你可以使用set_axis方法,使得其中一个数据框的索引标签与另一个相同,并且水平拼接或连接。与reset_index不同的是,该方法保留了其中一个数据框的索引标签。
joined_df = pd.concat([df_a.set_axis(df_b.index), df_b], axis=1)
# or using `join`
joined_df = df_a.set_axis(df_b.index).join(df_b)

res


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接