为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花如伊 2021-12-09 10:32:54
我有一个数据框,memory看起来像这样:>>> memory  input             action result      1   2   3   4 action      1   2   3   40    11  22  33  44      a     10  20  30  401    10  20  30  40      b     90  90  90  902    90  90  90  90      c     91  91  91  91>>> type(memory)<class 'pandas.core.frame.DataFrame'>我有一个数据框,bla看起来像这样:>>> bla    1   2   3   40  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   41    10  20  30  40      b     90  90  90  902    90  90  90  90      c     91  91  91  91和一个bla被选中的地方:>>> memory_bla  input             action result      1   2   3   4 action      1   2   3   40    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   40    11  22  33  44      a     10  20  30  40这不只是悲伤吗?特别是在我的情况下,我可以拥有可变数量的inputs(不仅仅是 4)。当然有更好的方法来选择和反对子数据框(即使较大的数据框具有多个列级别),可能涉及merge? 你能为我指出正确的方向吗?
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

使用 merge


idx=df.loc[:,'input'].merge(bla,indicator =True).index

df1=df.loc[df.index.difference(idx),:]

df2=df.loc[idx]

df1

Out[683]: 

  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

df2

Out[684]: 

  input             action result            

      1   2   3   4 action      1   2   3   4

0    11  22  33  44      a     10  20  30  40


查看完整回答
反对 回复 2021-12-09
?
皈依舞

TA贡献1851条经验 获得超3个赞

在没有您的数据的情况下,您可以通过首先执行 aleft merge并包括indicator=True和之后过滤来实现这一点left_only:


# Example data

np.random.seed(0)

left = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value': np.random.randn(4)})    

right = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value': np.random.randn(4)})


print(left)

print(right)

  key     value

0   A  1.764052

1   B  0.400157

2   C  0.978738

3   D  2.240893

  key     value

0   B  1.867558

1   D -0.977278

2   E  0.950088

3   F -0.151357

执行左连接


df_join = pd.merge(left, right, on='key', how='left', indicator=True)

print(df_join)

  key   value_x   value_y     _merge

0   A  1.764052       NaN  left_only

1   B  0.400157  1.867558       both

2   C  0.978738       NaN  left_only

3   D  2.240893 -0.977278       both

仅在左侧过滤


unmatch = df_join[df_join['_merge'] == 'left_only']

print(unmatch)

  key   value_x  value_y     _merge

0   A  1.764052      NaN  left_only

2   C  0.978738      NaN  left_only


查看完整回答
反对 回复 2021-12-09
  • 2 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信