【问题标题】:Create two dataframes from two dataframes based on multiindex in one dataframe and columns in another dataframe基于一个数据帧中的多索引和另一个数据帧中的列从两个数据帧创建两个数据帧
【发布时间】:2020-09-18 11:38:10
【问题描述】:

我不确定这是否已经被回答过。但我的要求是 我有一个这样的数据框:

df1:

         A  B
I1 I2

x11 x12  a11 b11
x12 x22  a21 b21

请注意,这具有[I1, I2] 的多索引和[A, B]

然后是这样的另一个数据框:

df2:

    I1   I2
  0  x11  x12
  1  y11  y12

这有列 [I1, I2]df1 的多索引相同。

现在我想创建两个数据框,如下所示:

df3 的行,df1 中的索引与 df2 中的列值的索引匹配

A  B
a11 b11

df4 与剩余的即

A  B
a21 b21

我知道如何使用iterrows() 执行此操作,但效率不高。寻找矢量化解决方案。谢谢。

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

    让我们试试reset_indexmerge

    df3=df1.reset_index().merge(df2).set_index(['I1','I2'])
    df4=df1.drop(df3.index)
    

    或者

    idx=pd.MultiIndex.from_frame(df2)
    df3=df1.reindex(idx).dropna()
    df4=df1.drop(df3.index)
    

    【讨论】:

    • 谢谢,我要去看看这个。另外,在第一种方法中,我得到了一个类型为 [I1, [I21, I22]] 的多索引,我怎样才能像 [I1, I21][I1, I22] 一样将其展平?
    • @check itertools 产品?
    【解决方案2】:

    只是为了记录另一种方法,发布此:

    我可以在df2[I1, I2]set_index,然后执行isin 之类的操作:

    is_index_there = df1.index.isin(df2.set_index([I1, I2]).index)

    然后使用它来创建单独的 dfs,例如:

    df3 = df1.loc[is_index_there == True]

    df4 = df2.loc[is_index_there == False]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-12
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多