如何过滤子数据帧上的多维数据帧

我有一个数据框,memory看起来像这样:


>>> memory

  input             action result

      1   2   3   4 action      1   2   3   4

0    11  22  33  44      a     10  20  30  40

1    10  20  30  40      b     90  90  90  90

2    90  90  90  90      c     91  91  91  91

>>> type(memory)

<class 'pandas.core.frame.DataFrame'>

我有一个数据框,bla看起来像这样:


>>> bla

    1   2   3   4

0  11  22  33  44

>>> type(bla)

<class 'pandas.core.frame.DataFrame'>

我想要一个由取出的memory地方制成的 daraframe bla:


>>> minus_bla

  input             action result

      1   2   3   4 action      1   2   3   4

1    10  20  30  40      b     90  90  90  90

2    90  90  90  90      c     91  91  91  91

和一个bla被选中的地方:


>>> memory_bla

  input             action result

      1   2   3   4 action      1   2   3   4

0    11  22  33  44      a     10  20  30  40

我试图通过过滤来做到这一点,但这很愚蠢:


memory[memory.loc[:,'input'] == bla]

我收到此错误:


ValueError: Can only compare identically-labeled DataFrame objects

无论如何,也许我可以用 a 来做到这一点,merge但到目前为止我还没有运气。


我现在解决这个问题的方法是产生一个如下所示的切片条件的巨大解决方法:


>>> memory[

    (memory[('input', 1)]==bla.loc[0, 1]) & 

    (memory[('input', 2)]==bla.loc[0, 2]) & 

    (memory[('input', 3)]==bla.loc[0, 3]) &

    (memory[('input', 4)]==bla.loc[0, 4])]

  input             action result

      1   2   3   4 action      1   2   3   4

0    11  22  33  44      a     10  20  30  40

这不只是悲伤吗?特别是在我的情况下,我可以拥有可变数量的inputs(不仅仅是 4)。


当然有更好的方法来选择和反对子数据框(即使较大的数据框具有多个列级别),可能涉及merge? 你能为我指出正确的方向吗?


繁花如伊
浏览 187回答 2
2回答

喵喵时光机

使用 mergeidx=df.loc[:,'input'].merge(bla,indicator =True).indexdf1=df.loc[df.index.difference(idx),:]df2=df.loc[idx]df1Out[683]:&nbsp;&nbsp; input&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;action result&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;2&nbsp; &nbsp;3&nbsp; &nbsp;4 action&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;2&nbsp; &nbsp;3&nbsp; &nbsp;41&nbsp; &nbsp; 10&nbsp; 20&nbsp; 30&nbsp; 40&nbsp; &nbsp; &nbsp; b&nbsp; &nbsp; &nbsp;90&nbsp; 90&nbsp; 90&nbsp; 902&nbsp; &nbsp; 90&nbsp; 90&nbsp; 90&nbsp; 90&nbsp; &nbsp; &nbsp; c&nbsp; &nbsp; &nbsp;91&nbsp; 91&nbsp; 91&nbsp; 91df2Out[684]:&nbsp;&nbsp; input&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;action result&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;2&nbsp; &nbsp;3&nbsp; &nbsp;4 action&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp;2&nbsp; &nbsp;3&nbsp; &nbsp;40&nbsp; &nbsp; 11&nbsp; 22&nbsp; 33&nbsp; 44&nbsp; &nbsp; &nbsp; a&nbsp; &nbsp; &nbsp;10&nbsp; 20&nbsp; 30&nbsp; 40

皈依舞

在没有您的数据的情况下,您可以通过首先执行 aleft merge并包括indicator=True和之后过滤来实现这一点left_only:# Example datanp.random.seed(0)left = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': np.random.randn(4)})&nbsp; &nbsp;&nbsp;right = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': np.random.randn(4)})print(left)print(right)&nbsp; key&nbsp; &nbsp; &nbsp;value0&nbsp; &nbsp;A&nbsp; 1.7640521&nbsp; &nbsp;B&nbsp; 0.4001572&nbsp; &nbsp;C&nbsp; 0.9787383&nbsp; &nbsp;D&nbsp; 2.240893&nbsp; key&nbsp; &nbsp; &nbsp;value0&nbsp; &nbsp;B&nbsp; 1.8675581&nbsp; &nbsp;D -0.9772782&nbsp; &nbsp;E&nbsp; 0.9500883&nbsp; &nbsp;F -0.151357执行左连接df_join = pd.merge(left, right, on='key', how='left', indicator=True)print(df_join)&nbsp; key&nbsp; &nbsp;value_x&nbsp; &nbsp;value_y&nbsp; &nbsp; &nbsp;_merge0&nbsp; &nbsp;A&nbsp; 1.764052&nbsp; &nbsp; &nbsp; &nbsp;NaN&nbsp; left_only1&nbsp; &nbsp;B&nbsp; 0.400157&nbsp; 1.867558&nbsp; &nbsp; &nbsp; &nbsp;both2&nbsp; &nbsp;C&nbsp; 0.978738&nbsp; &nbsp; &nbsp; &nbsp;NaN&nbsp; left_only3&nbsp; &nbsp;D&nbsp; 2.240893 -0.977278&nbsp; &nbsp; &nbsp; &nbsp;both仅在左侧过滤unmatch = df_join[df_join['_merge'] == 'left_only']print(unmatch)&nbsp; key&nbsp; &nbsp;value_x&nbsp; value_y&nbsp; &nbsp; &nbsp;_merge0&nbsp; &nbsp;A&nbsp; 1.764052&nbsp; &nbsp; &nbsp; NaN&nbsp; left_only2&nbsp; &nbsp;C&nbsp; 0.978738&nbsp; &nbsp; &nbsp; NaN&nbsp; left_only
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python