Задание значения столбца для фрагмента DataFrame не работает - PullRequest
0 голосов
/ 25 марта 2019

У меня есть набор данных с информацией о заработной плате сотрудников (df2).У него есть дата, название должности, время начала смены, отработанные часы.

Цель состоит в том, чтобы создать набор данных (df), который показывает, сколько сотрудников работало в любой данный час.

Проблема, с которой я сталкиваюсь, заключается в том, что установка значения в столбце не влияет на исходный набор данных (df).

data1 = [['2/1/2019','Cashier',0,0,0,0,0,0,0], ['2/2/2019','Cashier',0,0,0,0,0,0,0], ['2/1/2019','Server',0,0,0,0,0,0,0]]
cols1 = ['Date', 'Job'] + list(pd.date_range(pd.to_datetime('2/1/2019 15:00'), periods=7, freq='H'))
df=pd.DataFrame(data1, columns=cols1)

data2=[['2/1/2019', 'Cashier', pd.to_datetime('2/1/2019 16:00'), 5.2]]
cols2=['Date', 'Job', 'Start', 'Hours']
df2=pd.DataFrame(data2, columns=cols2)
def count_shifts(x):
    start_time=x['Start']
    worked_in_minutes =round(x['Hours']) * 60 + (x['Hours'] - round(x['Hours']))
    worked_range_index = pd.date_range(start_time, periods=worked_in_minutes, freq='T')
    worked_series = pd.Series(1/60, index=worked_range_index)
    worked_series=worked_series.resample('H', label='left').sum()
    df.loc[:,list(worked_series.index)] \
        [(df['Job']==x['Job']) & (df['Date']==x['Date'])] = worked_series.values


df2.apply(count_shifts, axis=1)

Я ожидаю, что столбцы df, соответствующие часам 15: 00,16: 00,17: 00,18: 00,19: 00 равны 1 и 20:00 равны .2 Но фактический результат заключается в том, что они по-прежнему равны 0

1 Ответ

0 голосов
/ 25 марта 2019

Есть две проблемы:

Первый

worked_in_minutes =round(x['Hours']) * 60 + (x['Hours'] - round(x['Hours'])) не выполняет то, что вы ожидаете.Это равно 300,2 для первой строки в df2 вместо 312, что вы могли ожидать.Нет смысла выделять часы / минуты, так как они уже в десятичном виде.worked_in_minutes = round(x['Hours'] * 60 должно хватить.

Во-вторых, ваш оператор присваивания сначала получает подмножество, а затем что-то устанавливает.Это может иметь неожиданное поведение.

Измените его на df.loc[(df['Job']==x['Job']) & (df['Date']==x['Date']),list(worked_series.index)] = worked_series.values

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...