在其他列的多个条件为True的情况下,动态查询pandas df的列值

bq9c1y66  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(127)

我有一个看起来像这样的dataframe:
| 动物|动物园|
| --------------|--------------|
| 狮子|柏林|
| 狮子|慕尼黑|
| 狮子|巴黎|
| 猴子|柏林|
| 猴子|慕尼黑|
| 猴子|鹿特丹|
| bat |柏林|
| 鹅|鹿特丹|
| 老虎|巴黎|
| 老虎|慕尼黑|
我正在寻找一种方法来动态地构建一个查询,该查询返回出现在一组特定动物园中的动物的唯一值,例如位于柏林和慕尼黑动物园的所有动物。
结果应如下所示:

result = ['Lion', 'Monkey']

到目前为止我试过这个

# # initialize list of lists
data = [
        ['Lion', 'Berlin'], ['Lion', 'Munich'], ['Lion', 'Paris'],
        ['Monkey', 'Berlin'], ['Monkey', 'Munich'], ['Monkey', 'Rotterdam'],
        ['Bat', 'Berlin'],
        ['Goose', 'Rotterdam'],
        ['Tiger', 'Paris'], ['Tiger', 'Munich']
]
  
# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['Animal', 'Zoo'])

# filter df
df_filtered = df.query(" (`Zoo` == 'Berlin' | `Zoo` == 'Munich')")

# get animals as list
result = df_filtered['Animal'].unique().tolist()

# print list of results
print(result)

这给了我在柏林或慕尼黑出现的动物。

['Lion', 'Monkey', 'Bat', 'Tiger']

将OR转换为AND语句会导致一个空的dataframe:

df.query(" (`Zoo` == 'Berlin' & `Zoo` == 'Munich')")
am46iovg

am46iovg1#

使用groubby:

result = df.groupby('Animal').filter(lambda x: set(['Berlin', 'Munich']).issubset(set(x['Zoo']))).Animal.unique().tolist()

输出: ['Lion','Monkey']

6fe3ivhb

6fe3ivhb2#

要获取两个动物园中都存在的动物,您需要通过这些动物园过滤初始数据集,并通过匹配2个所需的动物园来过滤动物组:

zoos = {'Berlin', 'Munich'}
df[df.Zoo.isin(zoos)].groupby('Animal').filter(lambda x: x['Zoo'].nunique() == 2)
Animal     Zoo
0    Lion   Berlin
1    Lion   Munich
3  Monkey   Berlin
4  Monkey   Munich

相关问题