【问题标题】:Pandas merge for multiheader dataframePandas 合并多头数据帧
【发布时间】:2020-06-14 13:19:21
【问题描述】:

对于一个日常分析脚本,我想以递归方式将多头数据帧与另一个多头数据帧合并。所以基本上我的每个数据框都会有一个公共列,其余列将按日期添加。

代码:

import pandas as pd

L = [('Category','Fruits','colors'),(d,'A','C')]
cols = [(new, c) for new, start, end in L for c in df1.loc[:, start:end].columns]
df1.columns = pd.MultiIndex.from_tuples(cols)
df3 = pd.DataFrame(df1.values.tolist(), columns= pd.MultiIndex.from_tuples(cols))
df1


M = [('Category','Fruits','colors'),('20200605','A','C')]
cols = [(new, c) for new, start, end in M for c in df2.loc[:, start:end].columns]
df2.columns = pd.MultiIndex.from_tuples(cols)
df4 = pd.DataFrame(df2.values.tolist(), columns= pd.MultiIndex.from_tuples(cols))

####Dataframe merge
df5=pd.merge(df3,df4,on=['Category','Fruits','colors'],how='outer')

(d 是日期,每天都在变化) 给我的错误如下:

    ValueError: The column label 'Category' is not unique.
    For a multi-index, the label must be a tuple with elements corresponding to each level.

同样,需要进一步合并另一个数据框。

多头不能合并数据帧,我是否需要删除堆栈级别?我也试过pd.concat,但它会创建列和行的重复条目。我希望“类别”列是唯一的,并且仅在新条目的情况下添加值。

还有其他方法可以实现吗?

【问题讨论】:

  • 不需要移除栈层;你可以使用多索引(pandas.pydata.org/pandas-docs/stable/reference/api/…),然后你只需要一个'join'。
  • 最后说明 - 不要在您的问题中放置代码或数据的图像。发布数据,或者更好的是,发布用于创建示例的代码。这个问题应该可以帮助您了解如何。 stackoverflow.com/questions/20109391/…祝你好运!
  • 您好,谢谢您的回答。我不能删除列,因为如果在新数据框中找到,我也想添加新类别。基本上原始数据框会附加日常数据。因此 df 中的任何新条目都应包含在原始数据中
  • 好的,注意了,谢谢,下次我会注意的
  • 你能发布一个示例数据吗?同时你可以试试df3=pd.merge(df1,df2,on=['Category', 'Fruits'],how='outer']

标签: python-3.x pandas dataframe merge


【解决方案1】:

看起来您有多个索引列。您可以删除列索引的级别并像这样合并数据框

df3.columns = df3.columns.droplevel()
df4.columns = df4.columns.droplevel()

df3

Fruits  colors  A   B   C
0   Orange  Orange  a   4   7
1   Banana  yellow  b   5   8
2   Apple   red c   4   9
3   Grapes  green   d   5   4

df3.merge(df4, on=['Fruits', 'colors'])

    Fruits  colors  A_x B_x C_x A_y B_y C_y
0   Orange  Orange  a   4   7   a   4   7
1   Banana  yellow  b   5   8   b   5   8
2   Apple   red c   4   9   c   4   9
3   Grapes  green   d   5   4   d   5   4

【讨论】:

  • 谢谢。是的,我可以,为了再次输出,我必须在合并后将其设为多级。因为列名基于日期(动态)。如果您能进一步指导我,那就太好了。
  • 我们可以创建一个多索引列名并将其分配回来,但您真的需要它吗?当您每次运行上述合并时,它会将新添加的日期作为新列添加到数据框中,我认为这是您需要的,对吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 2021-01-10
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
相关资源
最近更新 更多