どのMake-Auctionグループでも少なくとも1つの売上が100以上になるようにSales列でフィルタリングを実行したいと思います。したがって、Acuraの場合、Copartの売上は101であるため、Acuraの両方の行が出力で期待されます。BMWの場合、CopartとIAAの両方の売上が100未満であるため、除外されます。
データフレーム:
Make Auction Sales
Acura Copart 101
Acura IAA 88
BMW Copart 50
BMW IAA 60
Buick Copart 130
Buick IAA 140
期待される出力:
Make Auction Sales
Acura Copart 101
Acura IAA 88
Buick Copart 130
Buick IAA 140
販売列全体に100を超えるフィルターを適用できますが、それは私が望んでいたものではありません。これを実行する方法について何か提案はありますか?ありがとう!
ろ過を使用する:
df = df.groupby('Make').filter(lambda x: x['Sales'].ge(100).any())
print (df)
Make Auction Sales
0 Acura Copart 101
1 Acura IAA 88
4 Buick Copart 130
5 Buick IAA 140
別の溶液loc
とboolean indexing
するためMake
によりフィルタリングされた値isin
。
print (df.loc[df['Sales'] >= 100, 'Make'])
0 Acura
4 Buick
5 Buick
Name: Make, dtype: object
print (df['Make'].isin(df.loc[df['Sales'] >= 100, 'Make']))
0 True
1 True
2 False
3 False
4 True
5 True
Name: Make, dtype: bool
df = df[df['Make'].isin(df.loc[df['Sales'] >= 100, 'Make'])]
print (df)
Make Auction Sales
0 Acura Copart 101
1 Acura IAA 88
4 Buick Copart 130
5 Buick IAA 140
2番目の解決策はより高速です:
np.random.seed(123)
N = 1000000
L = list('abcdefghijklmno')
df = pd.DataFrame({'Make': np.random.choice(L, N),
'Sales':np.random.randint(110, size=N)})
print (df)
In [59]: %timeit df[df['Make'].isin(df.loc[df['Sales'] >= 100, 'Make'])]
10 loops, best of 3: 55.6 ms per loop
#Alexander answer
In [60]: %timeit df[df['Make'].isin(df[df['Sales'] >= 100]['Make'].unique())]
10 loops, best of 3: 65 ms per loop
In [61]: %timeit df.groupby('Make').filter(lambda x: x['Sales'].ge(100).any())
1 loop, best of 3: 217 ms per loop
#piRSquared solution 1
In [62]: %timeit df[df.Sales.ge(100).groupby([df.Make]).transform('any')]
1 loop, best of 3: 135 ms per loop
#piRSquared solution 2
In [63]: %%timeit
...: f, u = pd.factorize(df.Make.values)
...: w = df.Sales.values >= 100
...: df[(np.bincount(f, w) > 0)[f]]
...:
10 loops, best of 3: 67.2 ms per loop
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加