pandas concat/merge/join 多个数据帧,该列只有一列
Posted
技术标签:
【中文标题】pandas concat/merge/join 多个数据帧,该列只有一列【英文标题】:pandas concat/merge/join multiple dataframes with only one column by this column 【发布时间】:2019-08-07 08:37:58 【问题描述】:我有(超过)两个数据框:
In [22]: df = pd.DataFrame('database' : ['db1', 'db2', 'db3'])
In [23]: df1 = pd.DataFrame('database' : ['db1', 'db2', 'db3'])
In [24]: df2 = pd.DataFrame('database' : ['db2', 'db3', 'db4'])
In [25]: df1
Out[25]:
database
0 db1
1 db2
2 db3
In [26]: df2
Out[26]:
database
0 db2
1 db3
2 db4
我想要输出的是这种格式的数据框:
Out[45]:
database database
0 db1
1 db2 db2
2 db3 db3
3 db4
我设法以这种格式获得它:
df1.index = df1.database.values.ravel()
df2.index = df2.database.values.ravel()
pd.concat([df1, df2], axis=1).fillna('').reset_index(drop=True)
但我认为必须有比这个带有 ravel() 函数的技巧更好的解决方案。
【问题讨论】:
【参考方案1】:将DataFrame.set_index
与drop=False
一起使用:
df = (pd.concat([df1.set_index('database', drop=False),
df2.set_index('database', drop=False)], axis=1)
.fillna('')
.reset_index(drop=True))
print (df)
database database
0 db1
1 db2 db2
2 db3 db3
3 db4
更多动态解决方案list comprehension
:
dfs = [df, df1, df2]
dfs1 = [x.set_index('database', drop=False) for x in dfs]
df = (pd.concat(dfs1, axis=1)
.fillna('')
.reset_index(drop=True))
print (df)
database database database
0 db1 db1
1 db2 db2 db2
2 db3 db3 db3
3 db4
【讨论】:
【参考方案2】:您可以创建一个系列并将其作为一行附加到您的数据框中,然后将第二列移动 1。这是一个示例:
df = pd.concat([df1, df2], axis = 1)
import numpy as np
s = pd.Series([np.NaN, np,NaN], index = ['database', 'database1'])
df.append(s, ignore_index = True)
df['database1'] = df['database1'].shift(1)
df.fillna('')
这将产生预期的输出。希望这会有所帮助!
【讨论】:
以上是关于pandas concat/merge/join 多个数据帧,该列只有一列的主要内容,如果未能解决你的问题,请参考以下文章