如何pd.concat数据帧相对于列值而不是索引?

时间:2016-07-07 17:42:40

标签: python pandas dataframe concatenation

我有一个元数据的数据框表示为DF_0,然后是一个实际数据的数据框(DF_1)。我想在我的数据帧上使用pd.concat,但不在索引上使用DF_0DF_1的索引是任意的,attr_1的索引对应DF_0的{​​{1}}中的值。

我能想到的唯一方法是:

(1)使attr_1我的索引然后合并,我宁愿不做;或

(2)排序然后合并[但丢失的数据可能会搞砸了]。我觉得pandas已经想过这个。

有没有人知道如何使用pd.concat或类似的东西[我的真实数据有字符串,浮点数,整数]来合并2个[或更多?]数据帧沿着“轴”表示的特定数据框中特定列的值?

值可能与否有序。我上面描述的方式是唯一的方法吗?他们看起来很乱......

DF_0 = pd.DataFrame(np.arange(15).reshape(5,3), 
                    columns=["attr_%d"%j for j in range(3)])
#    attr_0  attr_1  attr_2
# 0       0       1       2
# 1       3       4       5
# 2       6       7       8
# 3       9      10      11
# 4      12      13      14

DF_1 = pd.DataFrame([[0,1,0,1,1],[0,0,0,1,0],[1,1,1,0,1]], 
                     index = ["other_%d"%j for j in range(3)], 
                     columns = [1,4,7,10,13]).T
#     other_0  other_1  other_2
# 1         0        0        1
# 4         1        0        1
# 7         0        0        1
# 10        1        1        0
# 13        1        0        1

# What I want
DF_X = pd.DataFrame(
                    np.concatenate([DF_0.as_matrix(), DF_1.as_matrix()], axis=1), 
                    columns=list(DF_0.columns) + list(DF_1.columns))
#    attr_0  attr_1  attr_2  other_0  other_1  other_2
# 0       0       1       2        0        0        1
# 1       3       4       5        1        0        1
# 2       6       7       8        0        0        1
# 3       9      10      11        1        1        0
# 4      12      13      14        1        0        1

3 个答案:

答案 0 :(得分:3)

您希望在attr_1的{​​{1}}列和DF_0的索引中合并:

DF_1

输出:

DF_X = pd.merge(DF_0, DF_1, left_on='attr_1', right_index=True)
print(DF_X)

答案 1 :(得分:2)

您正在寻找concat()方法的axis=1参数。

Here是一个很好的解释,有不同类型的加入/合并/连接的例子 演示:

In [6]: pd.concat([DF_0, DF_1], axis=1)
Out[6]:
   attr_0  attr_1  attr_2  other_0  other_1  other_2  other_3
0       0       1       2        1        0        0        1
1       3       4       5        4        1        0        1
2       6       7       8        7        0        0        1
3       9      10      11       10        1        1        0
4      12      13      14       13        1        0        1

答案 2 :(得分:1)

您的问题不在于pd.concat,而是了解您的需求。您可以通过考虑您已经展示DF_0DF_1的示例的最终结果来清除这一点。

如果attr_1DF_1索引相同,则:

pd.concat([DF_0.set_index('attr_1', drop=False), DF_1], axis=1)

enter image description here