Условно выбирая значения из pandas dataframe - PullRequest
0 голосов
/ 18 октября 2018

У меня есть датафрейм, в котором я хотел бы определить, сколько уникальных видов птиц видел каждый человек, принявший участие в моем «Большом году».

Я пытался использовать списки и циклы for, чтобы перебрать каждую строку и определить, является ли она уникальной, с помощью .is_unique (), но это, кажется, является источником многих моих проблем.Я могу получить список всех уникальных видов с помощью .unique (), довольно приятно, но я бы хотел как-то получить людей, связанных с этими птицами.

df = pd.DataFrame({'Species':['woodpecker', 'woodpecker', 'dove', 'mockingbird'], 'Birder':['Steve', 'Ben','Ben','Greg']})

ben_unique_bird = [x for x in range(len(df['Species'])) if df['Birder'][x]=='Ben' and df['Species'][x].is_unique()]

Редактировать: Я думаю, что я неясенв этом я хочу получить список птиц, которые каждый человек видел, что никто другой не видел.Таким образом, результат будет примерно таким (Steve, 0), (Ben, 1), (Greg, 1) в любом формате.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 20 октября 2018

Вы можете создать вспомогательную серию с помощью pd.DataFrame.duplicated и затем использовать GroupBy + sum:

counts = data.assign(dup_flag=df['Species'].duplicated(keep=False))\
             .groupby('Birder')['dup_flag'].sum().astype(int)

for name, count in counts.items():
    print(f'{name} saw {count} bird(s) that no one else saw')

Результат:

Ben saw 1 bird(s) that no one else saw
Greg saw 0 bird(s) that no one else saw
Steve saw 1 bird(s) that no one else saw
0 голосов
/ 18 октября 2018

имя уникальных птиц, которых они видели

 ben_unique_bird = df[df['Birder'] == 'Ben']['Species'].unique()

количество уникальных птиц, которых они видели

len(df[df['Birder'] == 'Ben']['Species'].unique())

Рекомендуемый способ 1 для получения таблицы

df.groupby(['Birder']).agg({"Species": lambda x: x.nunique()})

то же самоеметод сломан

for i in df['Birder'].unique():
    print (" Name ",i," Distinct count ",len(df[df['Birder'] == i]['Species'].unique())," distinct bird names ",df[df['Birder'] == i]['Species'].unique())
0 голосов
/ 20 октября 2018

Я придумала ужасный способ делать то, что я хочу, но это работает.Пожалуйста, дайте мне знать, если у вас есть более эффективный способ сделать это, потому что я знаю, что должен быть один.

data = pd.DataFrame({'Species':['woodpecker', 'woodpecker', 'dove', 'mockingbird'], 'Birder':['Steve', 'Ben','Ben','Greg']})

ben_birds = []
steve_birds = []
greg_birds = []

#get all the names of the birds that people saw and put them in a list
for index, row in data.iterrows():
    if row['Birder'] == 'Bright':
        ben_birds.append(row['Species'])
    elif row['Birder'] == 'Filios':
        steve_birds.append(row['Species'])
    else:
        greg_birds.append(row['Species'])

duplicates=[]
#compare each of the lists to look for duplicates, and make a new list with those
for bird in ben_birds:
    if (bird in steve_birds) or (bird in greg_birds):
        duplicates.append(bird)

for bird in steve_birds:
    if (bird in greg_birds):
        duplicates.append(bird)

#if any of the duplicates are in a list, remove those birds
for bird in ben_birds:
    if bird in duplicates:
        ben_birds.remove(bird)

for bird in steve_birds:
    if bird in duplicates:
        steve_birds.remove(bird)

for bird in greg_birds:
    if bird in duplicates:
        greg_birds.remove(bird)

print(f'Ben saw {len(ben_birds)} Birds that no one else saw')
print(f'Steve saw {len(steve_birds)} Birds that no one else saw')
print(f'Greg saw {len(greg_birds)} Birds that no one else saw')
0 голосов
/ 18 октября 2018

Это можно сделать с помощью понимания списка довольно просто.

df = pd.DataFrame({'Species':['woodpecker', 'woodpecker', 'dove', 'mockingbird'], 'Birder':['Steve', 'Ben','Ben','Greg']})

matches = [(row[1], row[2]) for row in df.itertuples() if (row[1],row[2]) not in matches]

В результате получается список кортежей:

[('Steve', 'woodpecker'), ('Ben', 'woodpecker'), ('Ben', 'dove'), ('Greg', 'mockingbird')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...