Pandas группировать по одному столбцу и сохранять только группы, в которых столбец имеет все значения в наборе - PullRequest
0 голосов
/ 05 августа 2020

У меня есть следующий df:

foo bar baz
aaa 0   Laos
aaa 45  Nigeria
aaa 123 Panama
bbb 12  Panama
bbb 826 Nigeria
ccc 0   Laos
ccc 15  Laos
ccc 72  Panama
ddd 4   Panama
ddd 9   Laos
ddd 987 Panama
ddd 25  Nigeria

У меня также есть набор: {"laos", "panama", "nigeria"}

Я хотел бы группировать ( "foo") и сохранить только те группы, для которых столбец "baz" содержит все значения в наборе.

Таким образом, результирующий df будет содержать только эти строки (поскольку bbb не содержит Лаос и ccc отсутствует Нигерия):

foo bar baz
aaa 0   Laos
aaa 45  Nigeria
aaa 123 Panama
ddd 4   Panama
ddd 9   Laos
ddd 987 Panama
ddd 25  Nigeria

Ответы [ 3 ]

2 голосов
/ 05 августа 2020

Попробуйте с

s=df.groupby('foo').\
      filter(lambda x : pd.Series(["laos", "panama", "nigeria"]).isin(x['baz'].str.lower()).all())
Out[21]: 
    foo  bar      baz
0   aaa    0     Laos
1   aaa   45  Nigeria
2   aaa  123   Panama
8   ddd    4   Panama
9   ddd    9     Laos
10  ddd  987   Panama
11  ddd   25  Nigeria
1 голос
/ 05 августа 2020
df1 = df[df.groupby('foo')['baz'].transform('nunique').eq(3)]
1 голос
/ 05 августа 2020

IIU C, Series.str.lower с Series.isin и GroupBy.transform

l = ["laos", "panama", "nigeria"]
s = df['baz'].str.lower()

m = (s.isin(l)
      .mask(df.duplicated(['baz', 'foo']), False)
      .groupby(df['foo'])
      .transform('sum').eq(len(l)))

df_filtered = df.loc[m]
print(df_filtered)


    foo  bar      baz
0   aaa    0     Laos
1   aaa   45  Nigeria
2   aaa  123   Panama
8   ddd    4   Panama
9   ddd    9     Laos
10  ddd  987   Panama
11  ddd   25  Nigeria

Аналогично :

m = ((s.isin(l) & (~df.duplicated(['baz', 'foo'])))
       .groupby(df['foo'])
       .transform('sum').eq(len(l)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...