簡體   English   中英

通過將列與多索引組進行比較來過濾熊貓數據框

[英]Filter pandas dataframe by comparing column to multiindex group

我有一個像下面的pandas DataFrame:

df = pandas.DataFrame({'A' : ['foo', 'foo', 'foo', 'foo', 'bar', 'bar', \
                               'bar', 'bar', 'baz', 'baz', 'baz', 'baz'],\
                        'B' : ['one', 'one', 'two', 'two', 'one', 'one', \
                               'two', 'two', 'one', 'one', 'two', 'two'],\
                        'C' : pandas.np.random.randn(12)})

df

    A    B         C
0   foo  one -0.241101
1   foo  one -0.658436
2   foo  two  0.300752
3   foo  two -0.589445
4   bar  one  1.775511
5   bar  one  0.068603
6   bar  two -0.464550
7   bar  two -0.621055
8   baz  one -1.469311
9   baz  one  0.490963
10  baz  two -0.606491
11  baz  two -0.006323

我想要做的是過濾C中小於組(A,B)平均值的那些值。

分組工作:

groups = df.groupby([df.A, df.B])
upper_bound = groups.C.mean()
upper_bound

A    B  
bar  one    0.922057
     two   -0.542803
baz  one   -0.489174
     two   -0.306407
foo  one   -0.449768
     two   -0.144346
Name: C, dtype: float64

但是我現在如何過濾,以便(在本例中)將刪除第1 foo one -0.6584361 foo one -0.658436

我嘗試了以下操作:

df_ = df.loc[df.C <= upper_bound.loc[df.A, df.B]]

但這說

'None of [0     foo\n1     foo\n2     foo\n3     foo\n4     bar\n5     bar\n6     bar\n7     bar\n8     baz\n9     baz\n10    baz\n11    baz\nName: A, dtype: object] are in the [index]'

我嘗試過:

df_ = df.loc[df.C <= upper_bound[df.A, df.B]]

這給了我:

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3824)()
pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3492)()
TypeError: 

我這樣做的原因是因為我已經(至少我認為)設法做到了“相同”的事情,但只有一個級別的小組:

groups = df.groupby([df.A])
upper_bound = groups.C.mean()
df_ = df.loc[df.C <= upper_bound.loc[df.A]

實際上,它消除了df中C低於upper_bound的所有內容。

有什么想法我做錯了嗎?

您將groupby upper_bound的結果與df['C'] ,但是它們具有不同數量的元素。 使用transform使每個組中存在的每行均值,並將其與df['C'] 使用loc塗抹此面膜:

import numpy as np

df.loc[df['C']>=df.groupby(['A','B']).transform(np.mean)['C'],]

Out[13]:
      A    B         C
0   foo  one  0.579987
3   foo  two  1.701136
5   bar  one  1.955158
7   bar  two  0.943862
9   baz  one -0.628506
10  baz  two  1.097203

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM