Назначить значения столбцов в группах по 3 - Python - PullRequest
0 голосов
/ 21 февраля 2019

Я стремлюсь к assign местам для людей в pandas df.В частности, используя df ниже, я определяю, сколько мест в настоящее время на .Я хочу использовать эти значения и assign их в группах по 3.

Например, общее количество мест, которые меньше 3, должно быть присвоено P1.Места с 3-6 должны быть назначены на P2 и т. Д.

Примечание. Общее количество мест, встречающихся за один раз, может достигать 20, поэтому количество назначенных групп должно соответствовать этому..

Вот моя попытка.

import pandas as pd
import numpy as np

d = ({
    'Time' : ['8:03:00','8:07:00','8:10:00','8:23:00','8:27:00','8:30:00','8:37:00','8:40:00','8:48:00'],                 
    'Place' : ['House 1','House 2','House 3','House 4','House 5','House 1','House 2','House 3','House 4'],                                     
     })

df = pd.DataFrame(data=d)

df['u'] = df[::-1].groupby('Place').Place.cumcount()
ids = [1]
seen = set([df.iloc[0].Place])
dec = False
for val, u in zip(df.Place[1:], df.u[1:]):
    ids.append(ids[-1] + (val not in seen) - dec)
    seen.add(val)
    dec = u == 0
df['Places On'] = ids

df = df.drop(df[['u']], axis=1)

def g(gps):
        s = gps['Place'].unique()
        d = dict(zip(s, np.arange(len(s)) // 3 + 1))
        gps['P'] = gps['Place'].map(d)
        return gps

df = df.groupby('Place', sort=False).apply(g)

Вывод:

      Time    Place  Places On  P
0  8:03:00  House 1          1  1
1  8:07:00  House 2          2  1
2  8:10:00  House 3          3  1
3  8:23:00  House 4          4  1
4  8:27:00  House 5          5  1
5  8:30:00  House 1          4  1
6  8:37:00  House 2          3  1
7  8:40:00  House 3          2  1
8  8:48:00  House 4          1  1

Предполагаемый вывод:

      Time    Place  Places On  P
0  8:03:00  House 1          1  1
1  8:07:00  House 2          2  1
2  8:10:00  House 3          3  1
3  8:23:00  House 4          4  2
4  8:27:00  House 5          5  2
5  8:30:00  House 1          4  2
6  8:37:00  House 2          3  1
7  8:40:00  House 3          2  1
8  8:48:00  House 4          1  1

1 Ответ

0 голосов
/ 21 февраля 2019
import pandas as pd
import numpy as np

d = ({
    'Time' : ['8:03:00','8:07:00','8:10:00','8:23:00','8:27:00','8:30:00','8:37:00','8:40:00','8:48:00'],                 
    'Place' : ['House 1','House 2','House 3','House 4','House 5','House 1','House 2','House 3','House 4'],                                     
     })

df = pd.DataFrame(data=d)

df['u'] = df[::-1].groupby('Place').Place.cumcount()
ids = [1]
seen = set([df.iloc[0].Place])
dec = False
for val, u in zip(df.Place[1:], df.u[1:]):
    ids.append(ids[-1] + (val not in seen) - dec)
    seen.add(val)
    dec = u == 0
df['Places On'] = ids

df = df.drop(df[['u']], axis=1)

def g(gps):
        s = gps['Place'].unique()
        d = dict(zip(s, np.arange(len(s)) // 3 + 1))
        gps['P'] = gps['Place'].map(d)
        return gps

df = df.groupby('Place', sort=False).apply(g)

for i in range(df.shape[0]):
    if(df['Places On'][i]<=3):
        df['P'][i]=1
    else:
        df['P'][i]=2
print(df)

Это должно работать на основе сортировки df ['Places On'].

...