Поиск с помощью Panda на основе определенной категоризации в Python

#python #python-3.x #pandas #dataframe #pandas-groupby

#python #python-3.x #панды #фрейм данных #pandas-groupby

Вопрос:

Дорогие, у меня есть csv-файл с нижеприведенным содержимым, есть несколько команд с участниками и командой, теперь я хочу выбрать капитана и другого человека, который заменит капитана в баскетбольной команде NBA.

Существует другая команда, поэтому я классифицировал их на TEAMA, TEAMB, TEAMC.

 SiteCode          Name    Type      NO
TEAMA       Al Horford      A       20
TEAMA       Tiago Splitter  B       19
TEAMA       Walter Tavares  C       18
TEAMA       Kris Humphries  D       17
TEAMA       Paul Millsap    E       16
TEAMB       Mike Muscala    A       20
TEAMB       Mike Scott      B       20
TEAMB       Dennis Schroder C       18
TEAMC       Jeff Teague     A       20
TEAMC       Kent Bazemore   B       19
  
  1. Если Type=A Заголовок равен A, если B существует, A будет заголовком B, и если существуют какие-либо другие члены, B будет заголовком любого другого члена:
    Я должен добавить No Captian и ReplaceCaptian в другие столбцы, я не знаю, как выполнить поиск на основе team и найти NO Captian и поместить его в поля CaptianNo.
    (Я думаю, мне следует продолжить и решить эту проблему, добавив цикл for и поиск на основе team.)

Код:

     import pandas as pd
    import numpy as np
    df = pd.read_csv("C:\Users\Desktop\P.csv")
    df["Captian"] = ["A" if x=="A" or x=="B" else "B" for x in df["Type"]]
    df["CaptianNO"] = ["A" if x=="A" or x=="B" else "A" for x in df["NO"]]
    df["ReplaceCaptain"] = ["A" if x=="A" else x for x in df["Type"]]
    df["ReplaceCaptainNO"] = ["A" if x=="A" else x for x in df["NO"]]
    print(df)
    df.head(3)
    df.to_csv('C:\Users\Desktop\Captian.csv')
  

Фактический результат кода, который CatianNO является A, а не значением NO, которое является относительным заголовком.

 ID  SiteCode    Name        Type    NO  Captian CaptianNO   ReplaceCaptain  ReplaceCaptainNO
0   TEAMA   Al Horford      A       20     A        A                A                20
1   TEAMA   Tiago Splitter  B       19     A        A                B                19
2   TEAMA   Walter Tavares  C       18     B        A                C                18
3   TEAMA   Kris Humphries  D       17     B        A                D                17
4   TEAMA   Paul Millsap    E       16     B        A                E                16
5   TEAMB   Mike Muscala    A       20     A        A                A                20
6   TEAMB   Mike Scott      B       19     A        A                B                19
7   TEAMB   Dennis Schroder C       18     B        A                C                18
8   TEAMA   Jeff Teague     A       20     A        A                A                20
9   TEAMA   Kent Bazemore   B       19     A        A                B                19
  

Ожидаемый результат:

 ID  SiteCode    Name       Type NO  Captian CaptianNO   ReplaceCaptain  ReplaceCaptainNO
0   TEAMA   Al Horford      A   20      A       20              A               20
1   TEAMA   Tiago Splitter  B   19      A       20              B               19
2   TEAMA   Walter Tavares  C   18      B       19              C               18
3   TEAMA   Kris Humphries  D   17      B       19              D               17
4   TEAMA   Paul Millsap    E   16      B       19              E               16
5   TEAMB   Mike Muscala    A   20      A       20              A               20
6   TEAMB   Mike Scott      B   19      A       20              B               20
7   TEAMB   Dennis Schroder C   18      B       19              C               18
8   TEAMA   Jeff Teague     A   20      A       20              A               20
9   TEAMA   Kent Bazemore   B   19      A       20              B               19
  

Комментарии:

1. ReplaceCaptain Правильно? Это тот же столбец, что Type и? Аналогично для ReplaceCaptainNO ?

2. Да, это нормально.

3. Хорошо, тогда супер. 😉

Ответ №1:

Для CaptianNO использования в столбцах DataFrame.join или DataFrame.merge с левым соединением:

 df["Captian"] = np.where(df["Type"].isin(['A','B']), "A", "B")
df = df.join(df.set_index(['SiteCode','Type'])['NO'].rename('CaptianNO'),
             on=['SiteCode','Captian'])
  

Альтернатива:

 d = {'NO': 'CaptianNO', 'Type':'Captian'}
df = df.merge(df[['SiteCode','Type','NO']].rename(columns=d), 
              on=['SiteCode','Captian'], how='left')
  

 df["ReplaceCaptain"] = df["Type"]
df["ReplaceCaptainNO"] = df["NO"]

print (df)
  SiteCode             Name Type  NO Captian  CaptianNO ReplaceCaptain  
0    TEAMA       Al Horford    A  20       A         20              A   
1    TEAMA   Tiago Splitter    B  19       A         20              B   
2    TEAMA   Walter Tavares    C  18       B         19              C   
3    TEAMA   Kris Humphries    D  17       B         19              D   
4    TEAMA     Paul Millsap    E  16       B         19              E   
5    TEAMB     Mike Muscala    A  20       A         20              A   
6    TEAMB       Mike Scott    B  19       A         20              B   
7    TEAMB  Dennis Schroder    C  18       B         19              C   
8    TEAMC      Jeff Teague    A  20       A         20              A   
9    TEAMC    Kent Bazemore    B  19       A         20              B   

   ReplaceCaptainNO  
0                20  
1                19  
2                18  
3                17  
4                16  
5                20  
6                19  
7                18  
8                20  
9                19  
  

Комментарии:

1. Это то, что я именно искал. полностью я понял, что делать. Большое спасибо за время, энергию.

2. О, только одна проблема. У меня дублированные значения. У меня 18 строк, у меня должно быть 9 строк.

3. @SaraDaniel — Это означает, что в столбцах есть дублированные значения ['SiteCode','Type'] ? Это ожидается?