我在 Python 中有一個資料框(簡化),看起來類似于:
Type | Market | Price
-------------------------
1 | A | 2
1 | B | 2
1 | B | 2
-------------------------
2 | A | 4
2 | C | 4
2 | C | 4
2 | B | 8
-------------------------
3 | A | 8
3 | B | 7
3 | B | 7
3 | C | 7
(為了更清楚,我根據不同的型別劃分了資料框)。
我想做的是對資料框進行子集化,這樣,如果每種型別的市場只有“A”和“B”(而不是“C”),那么我想保留它。例如,從上面的資料框中,由于型別“1”在市場中只有“A”和“B”,我想保留它,但由于型別“2”有“A”和“C”,然后是“B” ",那我就不想留了。另一方面,由于型別“3”有“A”,然后是“B”,然后是“C”,所以我想保留它。所以從這個資料框中,我想保留型別“1”和型別“3”。
我在實作這一點時遇到了一些麻煩,因為它需要非常具體的條件,不幸的是我不太擅長編程。這樣做的好方法是什么?提前致謝 :)
uj5u.com熱心網友回復:
df.loc[df.groupby('Type').Market.transform(lambda x : set(x) == {'A', 'B'} or all(x==sorted(x)))]
Type Market Price
0 1 A 2
1 1 B 2
2 1 B 2
7 3 A 8
8 3 B 7
9 3 B 7
10 3 C 7
uj5u.com熱心網友回復:
嘗試這個:
df.groupby('Type').filter(lambda g: ''.join(g.Market.unique()[:2]) == 'AB')
>>>
Type Market Price
0 1 A 2
1 1 B 2
2 1 B 2
7 3 A 8
8 3 B 7
9 3 B 7
10 3 C 7
uj5u.com熱心網友回復:
如果需要僅保留唯一值A,B或A,B,C按順序使用:
s = df.drop_duplicates(['Type','Market']).groupby('Type')['Market'].agg(tuple)
df = df[df['Type'].isin(s.index[s.isin([('A','B'),('A','B','C')])])]
print (df)
Type Market Price
0 1 A 2
1 1 B 2
2 1 B 2
7 3 A 8
8 3 B 7
9 3 B 7
10 3 C 7
另一個想法:
def f(x):
u = tuple(dict.fromkeys(x))
return (u == ('A','B')) | (u == ('A','B','C'))
df = df[df.groupby('Type').Market.transform(f)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/488339.html
下一篇:Python中的多列插值
