Заполните новый столбец pandas df на основе значений в другом - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь создать новый column в pandas df, который будет заполнен значениями в другом column. В частности, для df ниже я хочу заполнить 1 рядом со значениями 'Home' в Col['Location'].

import pandas as pd

d = ({
    'Day' : ['Mon','Tues','Mon','Wed','Thurs','Fri','Mon','Sat','Sun','Tues'],                 
    'Location' : ['Home','Home','Away','Home','Home','Home','Home','Home','Home','Away'],               
     })

df = pd.DataFrame(data=d)

В настоящее время я делаю это через это:

m = lambda x: dict(Home='1').get(x, '')
df = df.assign(Assign=df.Location.map(m))

Однако я хочу включить Col['Day'], чтобы изменить новые значения столбца. Я надеюсь на assign номера в трех выделениях. Для первых трех уникальных значений в Day я хочу пометить их все 1. Для 4-го, 5-го, 6-го уникальных значений я хочу пометить их 2 и т. Д.

Таким образом, для Location значения Home df, первые 3 unique значения в Day равны Mon, Tues, Wed, поэтому у них всех будет 1 рядом с ними. 4-е, 5-е, 6-е уникальные значения Thurs, Fri, Sat, поэтому они будут иметь 2 рядом с ними. Sun больше 6, поэтому у него будет 3

Предполагаемый результат:

     Day Location Assign
0    Mon     Home      1
1   Tues     Home      1
2    Mon     Away       
3    Wed     Home      1
4  Thurs     Home      2
5    Fri     Home      2
6    Mon     Home      1
7    Sat     Home      2
8    Sun     Home      3
9   Tues     Away       

1 Ответ

0 голосов
/ 05 сентября 2018

Я думаю, что первый фильтр только Home строк, удалить дубликаты и создать словарь для map - но только для отфильтрованных строк:

mask = df['Location'] == 'Home'
df1 = df[mask].drop_duplicates('Day')
d = dict(zip(df1['Day'], np.arange(len(df1)) // 3 + 1))

df.loc[mask, 'Assign'] = df.loc[mask, 'Day'].map(d)
print (df)
     Day Location  Assign
0    Mon     Home     1.0
1   Tues     Home     1.0
2    Mon     Away     NaN
3    Wed     Home     1.0
4  Thurs     Home     2.0
5    Fri     Home     2.0
6    Mon     Home     1.0
7    Sat     Home     2.0
8    Sun     Home     3.0
9   Tues     Away     NaN

Если хотите столбец целых чисел:

df['Assign'] = np.where(mask, df['Day'].map(d), 0)
print (df)
     Day Location  Assign
0    Mon     Home       1
1   Tues     Home       1
2    Mon     Away       0
3    Wed     Home       1
4  Thurs     Home       2
5    Fri     Home       2
6    Mon     Home       1
7    Sat     Home       2
8    Sun     Home       3
9   Tues     Away       0

А если не проблема со смешанным числом с пустыми строками:

df['Assign'] = np.where(mask, df['Day'].map(d), '')
print (df)
     Day Location Assign
0    Mon     Home      1
1   Tues     Home      1
2    Mon     Away       
3    Wed     Home      1
4  Thurs     Home      2
5    Fri     Home      2
6    Mon     Home      1
7    Sat     Home      2
8    Sun     Home      3
9   Tues     Away       
...