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不存在的情况下产生价值.
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)
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({})