在一片DataFrame上设置列值不起作用

时间:2019-03-25 00:23:49

标签: python pandas dataframe

我有一个包含员工工资信息(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 :(得分:0)

有两个问题:

第一

worked_in_minutes =round(x['Hours']) * 60 + (x['Hours'] - round(x['Hours']))并未达到您的期望。 df2中第一行等于300.2,而不是您期望的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