将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame
Posted
技术标签:
【中文标题】将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame【英文标题】:concat two pandas DataFrame with same column/index into one DataFrame 【发布时间】:2017-09-02 01:03:35 【问题描述】:我正在尝试在一个集合中将多个 pandas.DataFrame
保存在 mongodb
中,所有数据帧都具有相同的索引/列,我想将其保存在一个文档中,使用 @987654323 @ 方法。将数据框的所有单元格作为字典,这可能是一个好方法。为了实现这一点,我想像这样连接数据框:
df1:
index A B
1 'A1' 'B1'
2 'A2' 'B2'
3 'A3' 'B3'
df2:
index A B
1 'a1' 'b1'
2 'a2' 'b2'
3 'a3' 'b3'
预期的解决方案:
df_sol:
index A B
1 d1:'A1', d2:'a1' d1:'B1', d2:'b1'
2 d1:'A2', d2:'a2' d1:'B2', d2:'b2'
3 d1:'A3', d2:'a3' d1:'B3', d2:'b3'
有没有办法在不使用迭代器的情况下实现这一点?任何指导将不胜感激!谢谢!
【问题讨论】:
【参考方案1】:使用pd.Panel
和apply
+ pd.Series.to_dict
pd.Panel(dict(d1=df1, d2=df2)).apply(pd.Series.to_dict, 0)
A B
index
1 'd1': 'A1', 'd2': 'a1' 'd1': 'B1', 'd2': 'b1'
2 'd1': 'A2', 'd2': 'a2' 'd1': 'B2', 'd2': 'b2'
3 'd1': 'A3', 'd2': 'a3' 'd1': 'B3', 'd2': 'b3'
这是假设您标记为index
的列实际上是索引。否则,请确保它们是:
df1 = df1.set_index('index')
df2 = df2.set_index('index')
【讨论】:
这个解决方案现在给出了一个DeprecationWarning : Panel is deprecated and will be removed in a future version.
它有解决Panel
实现的方法吗?
@PabloA 打开一个新问题。提出相同的问题,但参考 pandas.Panel
现在已弃用,您需要一个替代方案。
@PabloA 我有另一种等待,其他人甚至可能提供更好的等待。
谢谢@PabloA。我已经回答过了(-:【参考方案2】:
让我们试试这段代码:
df1 = df1.set_index('index')
df2 = df2.set_index('index')
df_int = pd.merge(df1,df2,left_index=True, right_index=True,suffixes=('_d1','_d2'))
A_dict = df_int[['A_d1','A_d2']].rename(columns='A_d1':'d1','A_d2':'d2').to_dict(orient='records')
B_dict = df_int[['B_d1','B_d2']].rename(columns='B_d1':'d1','B_d2':'d2').to_dict(orient='records')
df_sol = pd.DataFrame('A':A_dict,'B':B_dict)
df_sol
输出:
A B
0 'd1': 'A1', 'd2': 'a1' 'd1': 'B1', 'd2': 'b1'
1 'd1': 'A2', 'd2': 'a2' 'd1': 'B2', 'd2': 'b2'
2 'd1': 'A3', 'd2': 'a3' 'd1': 'B3', 'd2': 'b3'
【讨论】:
以上是关于将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas - 具有不同列的 Concat 数据框忽略列名
Python:在相同索引上加入具有相同列前缀的两个 DataFrame