Pandas合并两个具有不同列的数据帧

eco*_*omy 37 python dataframe pandas data-munging

我肯定在这里遗漏了一些简单的东西.尝试在大多数具有相同列名的pandas中合并两个数据帧,但右侧数据框有一些左侧没有的列,反之亦然.

>df_may

  id  quantity  attr_1  attr_2
0  1        20       0       1
1  2        23       1       1
2  3        19       1       1
3  4        19       0       0

>df_jun

  id  quantity  attr_1  attr_3
0  5         8       1       0
1  6        13       0       1
2  7        20       1       1
3  8        25       1       1
Run Code Online (Sandbox Code Playgroud)

我尝试加入外连接:

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer")
Run Code Online (Sandbox Code Playgroud)

但那会产生:

Left data columns not unique: Index([....
Run Code Online (Sandbox Code Playgroud)

我还指定了一个要加入的列(on ="id",例如),但是复制除"id"之外的所有列,如attr_1_x,attr_1_y,这是不理想的.我还将整个列列表(有很多)传递给"on":

mayjundf = pd.DataFrame.merge(df_may, df_jun, how="outer", on=list(df_may.columns.values))
Run Code Online (Sandbox Code Playgroud)

产量:

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我想得到一个附加了所有行的df,attr_1,attr_2,attr_3尽可能填充NaN,它们没有出现.这似乎是数据调整的一个非常典型的工作流程,但我陷入困境.

提前致谢.

EdC*_*ica 63

我认为在这种情况下concat你想要的是:

In [12]:

pd.concat([df,df1], axis=0, ignore_index=True)
Out[12]:
   attr_1  attr_2  attr_3  id  quantity
0       0       1     NaN   1        20
1       1       1     NaN   2        23
2       1       1     NaN   3        19
3       0       0     NaN   4        19
4       1     NaN       0   5         8
5       0     NaN       1   6        13
6       1     NaN       1   7        20
7       1     NaN       1   8        25
Run Code Online (Sandbox Code Playgroud)

通过axis=0这里,你将df叠放在彼此的顶部,我相信这就是你想要的,然后NaN在他们各自的dfs不存在的情况下产生价值.

  • 由于某种原因,这对我不起作用。我得到 pandas.errors.InvalidIndexError: Reindexing only valid with unique valued Index 对象 (9认同)

tdy*_*tdy 15

如果存在重复的标题,接受的答案将被破坏:

InvalidIndexError:重新索引仅对具有唯一值的 Index 对象有效。

例如,这里A有 3xtrial列,这可以防止concat

A = pd.DataFrame([[3, 1, 4, 1]], columns=['id', 'trial', 'trial', 'trial'])
#    id  trial  trial  trial
# 0   3      1      4      1

B = pd.DataFrame([[5, 9], [2, 6]], columns=['id', 'trial'])
#    id  trial
# 0   5      9
# 1   2      6

pd.concat([A, B], ignore_index=True)
# InvalidIndexError: Reindexing only valid with uniquely valued Index objects
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请删除之前的列名称的重复项concat

parser = pd.io.parsers.base_parser.ParserBase({'usecols': None})

for df in [A, B]:
    df.columns = parser._maybe_dedup_names(df.columns) 

pd.concat([A, B], ignore_index=True)
#    id  trial  trial.1  trial.2
# 0   3      1        4        1
# 1   5      9      NaN      NaN
# 2   2      6      NaN      NaN
Run Code Online (Sandbox Code Playgroud)

或者作为一行但可读性较差的:

pd.concat([df.set_axis(parser._maybe_dedup_names(df.columns), axis=1) for df in [A, B]], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

请注意,对于 pandas <1.3.0,请使用:parser = pd.io.parsers.ParserBase({})