根据特定条件在Python中子集一个数据框架



我在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,BA,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

相关内容

  • 没有找到相关文章

最新更新