使用熊猫添加数据中的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用熊猫添加数据中的问题相关的知识,希望对你有一定的参考价值。

问题:-我想构建一个逻辑,该逻辑接收诸如考勤数据,及时,员工ID之类的数据,并返回一个包含员工ID,时间,出勤日期以及员工基本上在哪个时段输入的数据框。 (假设In time是日期14-10-2019的9:30:00,因此,如果雇员在9:30到来,则在该日期和该列中插入一个值1。)

下面给出示例

我花了很多时间来为这个问题建立逻辑,但未能建立。

“数据集”“ >>

我有一个看起来像这样的数据集。

我想要这样的输出,以便无论在什么时间(雇员输入的时间),它都只将数据插入到该时间列中,而仅是列中。“输出”

这是我的代码,但仅是重复的最后一个循环。

temp =[]
for date in nf['DaiGong']:
    for en in nf['EnNo']:
        for i in nf['DateTime']:


        col=['EnNo','Date','InTime','9:30-10:30','10:30-11:00','11:00-11:30','11:30-12:30','12:30-13:00','13:00-13:30']
        ndf=pd.DataFrame(columns=col)


        if i < '10:30:00' and i > '09:30:00':
            temp.append(1)
            ndf['9:30-10:30'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en


        elif i < '11:00:00' and i > '10:30:00':
            temp.append(1)
            ndf['10:30-11:00'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en
        elif i < '11:30:00' and i > '11:00:00':
            temp.append(1)
            ndf['11:00-11:30'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en

        elif i < '12:30:00' and i > '11:30:00':
            temp.append(1)
            ndf['11:30-12:30'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en

        elif i < '13:00:00' and i > '12:30:00':
            temp.append(1)
            ndf['12:30-13:00'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en
        elif i < '13:30:00' and i > '13:00:00':
            temp.append(1)
            ndf['13:00-13:30'] = temp
            ndf['InTime'] = i
            ndf['Date'] = date
            ndf['EnNo'] = en

这是我的代码的输出。

“输出”

问题:-我想构建一个逻辑,以获取诸如考勤数据,时间,员工ID之类的数据,并返回一个包含员工ID,时间,出勤日期以及基本上在哪个位置的员工的数据框...

答案

IIUC,

df = pd.DataFrame({'EnNo':[2,2,2,2,2,3,3,3,3],
             'DaiGong':['2019-10-12', '2019-10-13', '2019-10-14', '2019-10-15', '2019-10-16', '2019-10-12', '2019-10-13', '2019-10-14', '2019-10-15'],
             'DateTime':['09:53:56', '10:53:56', '09:23:56', '11:53:56', '11:23:56', '10:33:56', '12:53:56', '12:23:56', '09:53:56']})

df
DaiGong DateTime    EnNo
0   2019-10-12  09:53:56    2
1   2019-10-13  10:53:56    2
2   2019-10-14  09:23:56    2
3   2019-10-15  11:53:56    2
4   2019-10-16  11:23:56    2
5   2019-10-12  10:33:56    3
6   2019-10-13  12:53:56    3
7   2019-10-14  12:23:56    3
8   2019-10-15  09:53:56    3

import datetime
df['DateTime'] = pd.to_datetime(df['DateTime']).dt.time #converting to datetime

def time_range(row): # I only wrote two conditions - add more
    i = row['DateTime']
    if i < datetime.time(10, 30, 0) and i > datetime.time(9, 30, 0):
        return '9:30-10:30'
    elif i < datetime.time(11, 0, 0) and i > datetime.time(10, 30, 0):
        return '10:30-11:00'
    else:
        return 'greater than 11:00'


df['time range'] = df.apply(time_range, axis=1)
df1 = pd.concat([df[['EnNo', 'DaiGong', 'DateTime']], pd.get_dummies(df['time range'])], axis=1)
df1
EnNo    DaiGong DateTime    10:30-11:00 9:30-10:30  greater than 11:00
0   2   2019-10-12  09:53:56    0   1   0
1   2   2019-10-13  10:53:56    1   0   0
2   2   2019-10-14  09:23:56    0   0   1
3   2   2019-10-15  11:53:56    0   0   1
4   2   2019-10-16  11:23:56    0   0   1
5   3   2019-10-12  10:33:56    1   0   0
6   3   2019-10-13  12:53:56    0   0   1
7   3   2019-10-14  12:23:56    0   0   1
8   3   2019-10-15  09:53:56    0   1   0

To get sum of count by employee,

df1.groupby(['EnNo'], as_index=False).sum()
另一答案

我的测试数据:

以上是关于使用熊猫添加数据中的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用熊猫添加数据中的问题

向熊猫数据框箱线图添加标签?

使用数据透视表(熊猫)中的小计行时保留索引部分(不同的列)

拆垛一个多指标熊猫数据帧,同时保持相同的列

向熊猫中的数据框添加行

在 JSP 中的 <% %> 代码片段中添加链接