Условное именование для нескольких столбцов - PullRequest
1 голос
/ 30 апреля 2019

У меня есть набор данных;

>>> all_transcripts

ID  Type    Name
1   Guest   Hugo
1   Guest   Hugo   
1   Boss    Boss
1   Boss    Boss
2   Boss    Boss
2   Guest   Calvin
2   Guest   Calvin             
3   Guest   Klein
3   Boss    Boss

Теперь я хочу создать столбец с именем nameGuest, который будет содержать имя гостя для каждого идентификатора в каждой строке.Таким образом, мой желаемый вывод выглядит следующим образом:

>>> all_transcripts

ID  Type    Name     nameGuest
1   Guest   Hugo     Hugo
1   Guest   Hugo     Hugo   
1   Boss    Boss     Hugo
1   Boss    Boss     Hugo
2   Boss    Boss     Calvin
2   Guest   Calvin   Calvin
2   Guest   Calvin   Calvin    
3   Guest   Klein    Klein
3   Boss    Boss     Klein

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Используйте Series.map помощником Series, созданным boolean indexing, DataFrame.drop_duplicates и DataFrame.set_index для получить первое значение Guest для группы:

s = df[df['Type'] == 'Guest'].drop_duplicates('ID').set_index('ID')['Name']
df['nameGuest'] = df['ID'].map(s)
print (df)
   ID   Type    Name nameGuest
0   1  Guest    Hugo      Hugo
1   1  Guest    Hugo      Hugo
2   1   Boss    Boss      Hugo
3   1   Boss    Boss      Hugo
4   2   Boss    Boss    Calvin
5   2  Guest  Calvin    Calvin
6   2  Guest  Calvin    Calvin
7   3  Guest   Klein     Klein
8   3   Boss    Boss     Klein
1 голос
/ 30 апреля 2019

Groupby.first

Вы можете использовать groupby и перед этим фильтром на Type=Guest и выбрать имя first при агрегировании.

Это даст нам имена с соответствующими ID.Таким образом, мы можем сопоставить это с нашим фреймом данных и создать новый столбец:


names = df[df['Type'] == 'Guest'].groupby('ID')['Name'].first()

df['nameGuest'] = df['ID'].map(names)

print(df)
   ID   Type    Name nameGuest
0   1  Guest    Hugo      Hugo
1   1  Guest    Hugo      Hugo
2   1   Boss    Boss      Hugo
3   1   Boss    Boss      Hugo
4   2   Boss    Boss    Calvin
5   2  Guest  Calvin    Calvin
6   2  Guest  Calvin    Calvin
7   3  Guest   Klein     Klein
8   3   Boss    Boss     Klein

Вывод names

print(names)
ID
1      Hugo
2    Calvin
3     Klein
Name: Name, dtype: object
...