Проверьте, есть ли элемент в списке, затем напишите в новый столбец в кадре данных Pandas, если выполнены условия - PullRequest
0 голосов
/ 29 октября 2019

Глядя на информационный фрейм панд, содержащий информацию обо всех олимпийских спортсменах за последние 150 лет (имя, вес, страна, спорт и т. Д.). Доступно в https://www.kaggle.com/heesoo37/120-years-of-olympic-history-athletes-and-results#athlete_events.csv.

Предварительный просмотр кадра данных

Попытка создать цикл for, который перебирает строки df, проверяет значение, хранящееся в «Sport»column против нескольких списков, а затем добавляет столбец в df с родительской категорией в той же строке. Код на данный момент:

aquatic_sports = ['Swimming','Diving','Synchronized Swimming','Water Polo']
track_sports = ['Athletics','Modern Pentathlon','Triathlon','Biathlon','Cycling']
team_sports = ['Softball','Basketball','Volleyball','Beach Volleyball','Handball','Rugby','Lacrosse']
gymnastic_sports = ['Gymnastics','Rhytmic Gymnastics','Trampolining']
fitness_sports = ['Weightlifting']
combat_sports = ['Boxing','Judo','Wrestling','Taekwondo']
winter_sports = ['Short Track Speed Skating','Ski Jumping','Cross Country Skiing','Luge','Bobsleigh','Alpine Skiing','Curling','Snowboarding','Ice Hocky','Hockey','Speed Skating']

for index, row in df.iterrows():

    if df.iloc[0,11] in aquatic_sports:

        df['Sport Category'] = 'Aquatic Sport'

    elif df.iloc[0,11] in track_sports:

        df['Sport Category'] = 'Track Sport'

    elif df.iloc[0,11] in gymnastic_sports:

        df['Sport Category'] = 'Gymnastic Sport'

    elif df.iloc[0,11] in fitness_sports:

        df['Sport Category'] = 'Fitness Sport'

    elif df.iloc[0,11] in combat_sports:

        df['Sport Category'] = 'Combat Sport'

    elif df.iloc[0,11] in winter_sports:

        df['Sport Category'] = 'Winter Sport'

Ошибок нет, но, к сожалению, все значения в новом столбце совпадают. Не знаете, как передать текущий индекс, чтобы каждая итерация возвращала уникальное правильное значение.

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Причина одинаковых значений в столбце заключается в том, что всякий раз, когда вы делаете df['Sport Category'] = <something>, вы устанавливаете весь столбец на это значение. По сути, в вашем коде столбец обновляется несколько раз, но при этом сохраняется последнее установленное значение.

При установке значения можно попробовать df.ix[0, 'Sport Category'] = <something>, чтобы проверить, работает ли настройка.

0 голосов
/ 29 октября 2019

Это map, хотя нам нужно создать соответствующий словарь. Поскольку вы уже создали списки в отдельных переменных, мы можем вместо этого сохранить их в словаре с меткой, которую вы хотите использовать в качестве ключа:

d = {
    'Aquatic Sport': ['Swimming', 'Diving','Synchronized Swimming', 'Water Polo'],
    'Track Sports': ['Athletics','Modern Pentathlon', 'Triathlon', 'Biathlon', 'Cycling'],
    'Team Sport': ['Softball', 'Basketball', 'Volleyball', 'Beach Volleyball',
                   'Handball', 'Rugby', 'Lacrosse'],
    'Gymnastic Sport': ['Gymnastics', 'Rhytmic Gymnastics', 'Trampolining'],
    'Fitness Sport': ['Weightlifting'],
    'Combat Sport': ['Boxing','Judo', 'Wrestling', 'Taekwondo'],
    'Winter Sport': ['Short Track Speed Skating', 'Ski Jumping', 'Cross Country Skiing',
                     'Luge','Bobsleigh', 'Alpine Skiing', 'Curling', 'Snowboarding',
                     'Ice Hockey', 'Hockey', 'Speed Skating']
    }

# unpacks lists so it's {sport: category_label}
d = {sport: cat for cat,l in d.items() for sport in l}
df['Sport Category'] = df['Sport'].map(d)
...