【问题标题】:Join / Marge of DataFrame with MultiIndex-ed columns having different levels使用具有不同级别的 MultiIndex-ed 列加入/ Marge 的 DataFrame
【发布时间】:2021-03-12 21:06:09
【问题描述】:

我有这个具有不同 MultiIndex 级别的虚拟 DataFrame:

A = pandas.DataFrame({"A" : [1, 5], "B" : [3, 5], "Output1" : [6, 8]}).set_index(["A", "B"]).unstack().fillna(0)

  Output1     
B       3    5
A             
1     6.0  0.0
5     0.0  8.0


B = pandas.DataFrame({"A" : [1, 6], "B" : [3, 5], "C" : [33, 55], "Output2" : [6, 7, 8]}).set_index(["A", "B", "C"]).unstack([1, 2]).fillna(0)


  Output2     
B       3    5
C      33   55
A             
1     6.0  0.0
6     0.0  8.0

我想加入两个 DataFrame-s 并获得以下结果:

   (Output2, 3, 33)  (Output2, 5, 55)  (Output1, 3)  (Output1, 5)
A                                                                
1               6.0               0.0           6.0           0.0
5               0.0               0.0           0.0           8.0
6               0.0               8.0           0.0           0.0 

我能够使用

得到这个结果
res = B.join(A, how='outer').fillna(0)

但是,当我颠倒 A 和 B 时,B 的第一级索引消失了……并且级别数似乎被强制输入到连接断言的第一个 DataFrame 中。

达到预期结果的优雅方法是什么?

当前解决方案的第二个问题是可以如下查询DataFrame A或B:

A["Output1"]
B["Output2"]

但由于 MultiIndex-s 似乎被展平,因此无法以这种方式查询结果:

res["Output1"] #crash
res["Output2"] #crash

【问题讨论】:

  • 您的问题到底是什么?你可以这样做:res = pd.concat((B, A), axis=1).fillna(0)
  • 是的,这是同一个问题: concat((B,A)) 提供与 concat((A,B)) 不同的结果,并且无法以与 A 或 B 相同的方式查询结果:例如,MultiIndex 被展平,无法调用 res["Output1"]。我希望它澄清一点
  • 在一个索引中,您有 3 个级别,而在另外两个索引中,“A”的最后一个级别的合适值是多少?
  • 任何适合,例如“-”或“停止”或无

标签: python pandas dataframe join outer-join


【解决方案1】:

一种方法是:

A.columns = pd.MultiIndex.from_tuples([(*t, '-') for t in list(A.columns)])
res = pd.concat((B, A), axis=1).fillna(0)
print(res)

输出

  Output2      Output1     
B       3    5       3    5
C      33   55       -    -
A                          
1     6.0  0.0     6.0  0.0
5     0.0  0.0     0.0  8.0
6     0.0  8.0     0.0  0.0

那么你可以这样做:

print(res['Output1'])

输出

B    3    5
C    -    -
A          
1  6.0  0.0
5  0.0  8.0
6  0.0  0.0

如果你不想修改A,你可以这样做:

new_A = A.reindex(columns=pd.MultiIndex.from_tuples([(*t, '-') for t in list(A.columns)]))
res = pd.concat((B, new_A), axis=1).fillna(0)

【讨论】:

  • 您好,是否可以自动生成“-”,以匹配最长 df 的 col 级别?
  • 也不适用于这两个数据帧(尤其是 A) A = pandas.DataFrame({"A" : [1, 4], "Output1" : [6, 8]}) .set_index(["A"]).fillna(0) B = pandas.DataFrame({"A" : [1, 5], "B" : [3, 5], "Output2" : [6, 8] }).set_index(["A", "B"]).unstack().fillna(0)
猜你喜欢
  • 2018-11-01
  • 1970-01-01
  • 2018-10-15
  • 2020-06-21
  • 2018-11-04
  • 2018-08-14
  • 1970-01-01
  • 2019-02-16
  • 2022-10-18
相关资源
最近更新 更多