pandas:连接多个数据帧而不忽略索引python

时间:2018-04-27 11:37:57

标签: python pandas dataframe

我有三个数据帧:

df2 = pd.DataFrame(np.random.randint(0, 50, (3,3)), columns = ["A", "B", "C"], index = ["1", "2", "3"])
df3 = pd.DataFrame(np.random.randint(0, 50, (4,2)), columns = ["D", "E"], index = ["100", "101", "102", "103"])
df4 = pd.DataFrame(np.random.randint(0, 1000, (11,5)), columns = ["F", "G", "H", "I", "J"], index = ["1", "2", "3", "4", "5", "6", "7", "100", "101", "102", "103"])

我希望在

中连接这些数据帧
df5 = pd.DataFrame(columns = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"])

现在使用

df5 = pd.concat([df5, df2])
df5 = pd.concat([df5, df3])
df5 = pd.concat([df5, df4])

它会创建多个1,2,3,4,100,101,102和103个索引。我不希望它那样做。理想情况下,我希望FGHIJ的值可以粘贴在第一个索引1中,同样也适用于索引2,3,4,100,101,102,103。有人可以帮忙吗?

OutputDataframe

3 个答案:

答案 0 :(得分:1)

我认为你需要加入数据帧而不是连接它们。

df5 = df4.join([df2, df3])

join函数的默认设置是使用 index 作为列来执行连接操作。

答案 1 :(得分:0)

您使用的是什么版本的Python和Pandas?我正在使用Python 3.6和Pandas 22,我无法复制您的问题。这就是我做的。

从你的帖子

df2 = pd.DataFrame(np.random.randint(0, 50, (3,3)), columns = ["A", "B", "C"], index = ["1", "2", "3"])
df3 = pd.DataFrame(np.random.randint(0, 50, (4,2)), columns = ["D", "E"], index = ["100", "101", "102", "103"])
df4 = pd.DataFrame(np.random.randint(0, 1000, (11,5)), columns = ["F", "G", "H", "I", "J"], index = ["1", "2", "3", "4", "5", "6", "7", "100", "101", "102", "103"])

现在的解决方案(与Goyo的评论相同......似乎有效!):

df5 = pd.concat([df2, df3, df4], axis=1)

这给出了:

        A     B     C     D     E    F    G    H    I    J
1    38.0   2.0  25.0   NaN   NaN  886  767  281  771  980
100   NaN   NaN   NaN  42.0  30.0  305  986  192  554  697
101   NaN   NaN   NaN   2.0  45.0  581  910  767  513  758
102   NaN   NaN   NaN  31.0  21.0  767  102  825   90  904
103   NaN   NaN   NaN  32.0  35.0  342    3  293  549  506
2    22.0   8.0  26.0   NaN   NaN  140  697  705  289  330
3    28.0  46.0  32.0   NaN   NaN  672  928  503  406  903
4     NaN   NaN   NaN   NaN   NaN  298  306  122  115  323
5     NaN   NaN   NaN   NaN   NaN  937  702  732  677   60
6     NaN   NaN   NaN   NaN   NaN  276  869  812  552  299
7     NaN   NaN   NaN   NaN   NaN  445  288  107   66  165

从我原来的帖子中可以看出这是你想要的。这是你想要的吗?我在这里看到这个数据帧的唯一问题是索引没有排序。这可以通过调用df5.sort_index来解决。

如果这不是您想要的,请更具体。

答案 2 :(得分:0)

正如我之前所说,原始问题中提到的数据框是问题的一部分。实际上我有14个不同的数据帧,我使用Tabula包从2个寻呼机PDF中提取。实际的PDF在每个页面上有7个数据帧,具有相同的列标题。现在让我们不要讨论如何使用Tabula进行提取并关注数据帧。有人刚问过python版本,我使用的是Python 2.7。

Dataframes:

df2 = pd.DataFrame(np.random.randint(0, 250, (4,3)), columns = ["A", "B", "C"], index = [1, 2, 3, 4])
df3 = pd.DataFrame(np.random.randint(0, 250, (4,2)), columns = ["D", "E"], index = [100, 101, 102, 103])
df4 = pd.DataFrame(np.random.randint(0, 5000, (11,5)), columns = ["F", "G", "H", "I", "J"], index = [1, 2, 3, 4, 5, 6, 7, 100, 101, 102, 103])
df5 = pd.DataFrame(np.random.randint(0, 300, (4,2)), columns = ["N", "O"], index = [1, 2, 3, 4])
df6 = pd.DataFrame(np.random.randint(0, 250, (4,3)), columns = ["P", "Q", "R"], index = [1, 2, 3, 4])
df7 = pd.DataFrame(np.random.randint(0, 5000, (7,3)), columns = ["K", "L", "M"], index = [1, 2, 3, 100, 101, 102, 103])
df8 = pd.DataFrame(np.random.randint(0, 300, (4,1)), columns = ["S"], index = [100, 101, 102, 103])
df9 = pd.DataFrame(np.random.randint(0, 400, (4,3)), columns = ["A", "B", "C"], index = [1, 2, 3, 4])
df10 = pd.DataFrame(np.random.randint(0, 250, (4,2)), columns = ["D", "E"], index = [100, 101, 102, 103])
df11 = pd.DataFrame(np.random.randint(0, 5000, (11,5)), columns = ["F", "G", "H", "I", "J"], index = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
df12 = pd.DataFrame(np.random.randint(0, 500, (4,2)), columns = ["N", "O"], index = [1, 2, 3, 4])
df13 = pd.DataFrame(np.random.randint(0, 600, (4,3)), columns = ["P", "Q", "R"], index = [1, 2, 3, 4])
df14 = pd.DataFrame(np.random.randint(0, 700, (4,1)), columns = ["S"], index = [1, 2, 3, 4])
df15 = pd.DataFrame(np.random.randint(0, 5000, (7,3)), columns = ["K", "L", "M"], index = [1, 2, 3, 4, 5, 6 ,7])

我想在行而不是列上连接这些数据帧。首先,我创建了一个用于标识唯一索引列表的连续数据框:

df16 = pd.concat([df2, df3, df4, df5, df6, df7, df8, df9, df10, df11, df12, df13, df15, df14], axis = "columns")

然后,

df18 = pd.DataFrame(index = list(df16.index.unique()))
df19 = pd.DataFrame(index = list(df16.index.unique()))

创建两个空列数据帧的想法是避免重复列上的错误。然后作为@amr keleg(谢谢!)建议我继续将数据帧(df2 .... df8)从第一页加入df18,将第二页加入(df9 ... df15)。现在它变得更简单了:

df18 = df18.join([df2, df3, df4, df5, df6, df7, df8])
df19 = df19.join([df9, df10, df11, df12, df13, df14, df15])

现在使用pd.concat连接上述两个数据帧以获得所需的解决方案:

df20 = pd.concat([df18, df19])
df20.sort_index(axis = 0, inplace = True, ascending = True)

我不是Python的专家。我只是个学习者!对于那些有更好解决方案的人可以提供帮助。