繁体   English   中英

pandas:如何合并列而不考虑索引

[英]pandas: how to merge columns irrespective of index

我有两个具有无意义索引的数据框,但经过精心策划的顺序,我想在保留该顺序的同时合并它们。 因此,例如:

>>> df1
   First
a      1
b      3

>>> df2 
c       2
d       4

合并后,我想要得到的是这样的:

>>> Desired_output
                    First  Second
AnythingAtAll           1       2     # <--- Row Names are meaningless.
SeriouslyIDontCare      3       4     # <--- But the ORDER of the rows is critical and must be preserved.

我有行索引“a/b”和“c/d”这一事实无关紧要,但关键是行出现的顺序。 我见过的每个版本的“加入”都需要我手动重置索引,这看起来真的很尴尬,而且我不相信它不会搞砸排序。 我认为concat会起作用,但我明白了:

>>> pd.concat( [df1, df2] , axis = 1, ignore_index= True )
     0    1
a  1.0  NaN
b  3.0  NaN
c  NaN  2.0
d  NaN  4.0
# ^ obviously not what I want.

即使我明确声明了ignore_index

如何“否决”索引并强制将列与按照我提供它们的确切顺序保留的行合并?

ignore_index表示是否沿axis保留 output dataframe 索引。 如果为 True,则表示不使用原始索引,而是从 0 到 n 开始,就像结果中显示的 header 0, 1列一样。

你可以试试

out = pd.concat( [df1.reset_index(drop=True), df2.reset_index(drop=True)] , axis = 1)
print(out)

   First  Second
0      1       2
1      3       4

我认为这也应该有效:

df1["second"] = df2["second"].values

它将保留第一个 dataframe 的索引,但由于您在那里有诸如“AnyThingAtAll”和“SeriouslyIdontCare”之类的值,我猜任何索引值都是可以接受的。

基本上,我们只是将您的系列中的值作为新列添加到第一个 dataframe。

这是一个类似于您描述的问题的测试示例:

# -----------
# sample data
# -----------
df1 = pd.DataFrame(
{
    'x': ['a','b'],
    'First': [1,3],
})
df1.set_index("x", drop=True, inplace=True)
df2 = pd.DataFrame(
{
    'x': ['c','d'],
    'Second': [2, 4],
})
df2.set_index("x", drop=True, inplace=True)


# ---------------------------------------------
# Add series as a new column to first dataframe
# ---------------------------------------------
df1["Second"] = df2["Second"].values

结果是:

第一的 第二
一个 1 2
b 3 4

目标是结合基于 position 的数据(不是按索引)。 这是一种方法:

import pandas as pd

# create data frames df1 and df2
df1 = pd.DataFrame(data = {'First': [1, 3]}, index=['a', 'b'])
df2 = pd.DataFrame(data = {'Second': [2, 4]}, index = ['c', 'd'])

# add a column to df1 -- add by position, not by Index
df1['Second'] = df2['Second'].values

print(df1)
   First  Second
a      1       2
b      3       4

您可以像这样创建一个全新的数据框:

data = {'1st': df1['First'].values, '2nd': df1['Second'].values}
print(pd.DataFrame(data))

   1st  2nd
0    1    2
1    3    4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM