#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
- Если 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']
? Это ожидается?