我在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
(为了更清晰,我根据不同的类型划分了数据框架)。
我想做的是对数据框架进行子集,如果每种类型的Market只有"A"one_answers";B"(而不是"C")那么我想保留它。例如,从上面的数据框中,由于Type "1"只有"a";和";B"在Market中,我想保留它,但是自从Type &;2&;有"A"one_answers";C"然后"&;&;",然后我不想保留它。另一方面,由于Type "3"有"a",然后"b",然后"c",然后我想保留它。所以在这个数据框中,我想保留Type "1"并键入"3"
我实现这个有点麻烦,因为它需要非常具体的条件,不幸的是我不是很擅长编程。做这件事的好方法是什么?提前感谢:)
try this:
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
如果需要按顺序只保留唯一值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)]
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