在数据帧的切片上设置列值不起作用

2024-09-27 07:26:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我希望对应于15:00、16:00、17:00、18:00、19:00的df列等于1,20:00等于2,但实际结果仍然是0


Tags: 数据dfdateindex时间jobrangeseries
1条回答
网友
1楼 · 发布于 2024-09-27 07:26:47

有两个问题:

第一

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

相关问题 更多 >

    热门问题