Курортные ценности в пандах дф - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь переназначить или преобразовать значения в pandas df column.

Для кода ниже я хочу переназначить столбец [Person].В частности, если у любого Person меньше 3 unique values, я хочу объединить их.Если Person имеет 3 unique values, тогда оставьте как есть.

Пример:

Person 1, A
Person 1, B
Person 2, C
Person 1, D
Person 2, E
Person 3, F

Используя приведенный выше пример, Person 1 останется один, так как они имеют 3 unique values,в то время как Person 3 будет сгруппировано с Person 2, поскольку они имеют 2 и 1.

Ниже приведено то, что у меня есть:

d = ({
    'Time' : ['8:03:00','8:17:00','8:20:00','10:15:00','10:15:00','11:48:00','12:00:00','12:10:00'],                 
   'Place' : ['House 1','House 2','House 1','House 3','House 4','House 5','House 1','House 1'],                 
    'Area' : ['X','X','Y','X','X','X','X','X'],    
    'Person' : ['Person 1','Person 1','Person 2','Person 1','Person 3','Person 3','Person 1','Person 1'],                               
 })    

df = pd.DataFrame(data=d)

n = 3
df['complete'] = df.Person.apply(lambda x: 1 if df.Person.tolist().count(x) == n else 0)
df['num'] = df.Person.str.replace('Person ','')
df.sort_values(by=['num','complete'],ascending=True,inplace=True) 

c = 0
person_numbers = []
for x in range(0,999): 
    if x % n == 0:
        c += 1        
    person_numbers.append(c) 

df['Person_new'] = person_numbers[0:len(df)] 
df.Person = 'Person ' + df.Person_new.astype(str) 
df.drop(['complete','Person_new','num'],axis=1,inplace=True)

df['Time'] = pd.to_timedelta(df['Time'])
df = df.sort_values(by='Time')

Вывод:

      Time    Place Area    Person
0 08:03:00  House 1    X  Person 1
1 08:17:00  House 2    X  Person 1
2 08:20:00  House 1    Y  Person 2
3 10:15:00  House 3    X  Person 1
4 10:15:00  House 4    X  Person 3
5 11:48:00  House 5    X  Person 3
6 12:00:00  House 1    X  Person 2
7 12:10:00  House 1    X  Person 2

Это не распознает duplicate rows в Index 6-7.Они такие же как Index 0.Итак, Person 1 должно быть назначено здесь.Код не распознается duplicate values.Если я удаляю эти duplicated rows, код работает, но мой фактический набор данных содержит множество duplicates, которое может быть достигнуто, а ожидаемый результат будет:

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

       Time    Place Area    Person
0   8:03:00  House 1    X  Person 1
1   8:17:00  House 2    X  Person 1
2   8:20:00  House 1    Y  Person 2
3  10:15:00  House 3    X  Person 1
4  10:15:00  House 4    X  Person 2
5  11:48:00  House 5    X  Person 2
6  12:00:00  House 1    X  Person 1
7  12:10:00  House 1    X  Person 1

1 Ответ

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

Попробуйте сгруппировать данные, а затем выполнить итерации по группам с любыми желаемыми условиями.

d = ({
    'Time' : ['8:03:00','8:17:00','8:20:00','10:15:00','10:15:00','11:48:00','12:00:00','12:10:00'],
   'Place' : ['House 1','House 2','House 1','House 3','House 4','House 5','House 1','House 1'],
    'Area' : ['X','X','Y','X','X','X','X','X'],
    'Person' : ['Person 1','Person 1','Person 2','Person 1','Person 3','Person 3','Person 1','Person 1'],
 })

df = pd.DataFrame(data=d)

grouper = df.groupby(['Person','Area','Place'])

new_df = pd.DataFrame()

for index, group in grouper:
    # do what you want to group here
    if len(group.index) >= 2:
        # reassign to person 1?
        group['Person'] = 'Person 1'
    # append to new_df
    new_df = new_df.append(group)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...