如何从Python列表中删除标题和索引?

3

我基本上想从下面的DataFrame中创建在任何时间点办公室出勤的员工数量:

df = pd.DataFrame({
                    'Emp_id': [121,321,451,121,
                               451,451,321,755],
                    'TimeStamp': ['29-07-2019 08:55:55','29-07-2019 09:02:55','29-07-2019 09:05:50','29-07-2019 10:05:50',
                                  '29-07-2019 10:07:50','29-07-2019 10:10:10','29-07-2019 10:20:10','29-07-2019 11:00:00'],
                    'Status': ['IN','IN','IN','OUT','OUT','IN','OUT','IN']
})
df

    Emp_id  TimeStamp           Status
0   121     29-07-2019 08:55:55 IN
1   321     29-07-2019 09:02:55 IN
2   451     29-07-2019 09:05:50 IN
3   121     29-07-2019 10:05:50 OUT
4   451     29-07-2019 10:07:50 OUT
5   451     29-07-2019 10:10:10 IN
6   321     29-07-2019 10:20:10 OUT
7   755     29-07-2019 11:00:00 IN

我解决这个问题的方法是:对每个“Emp_id”进行分组,并找到其最大的“TimeStamp”条目。从中,如果我可以筛选出“IN”状态,然后计算所有这些状态的数量,就是仍在办公室的员工人数。

time_entry = df[['Emp_id','TimeStamp']].groupby(['Emp_id']).max()['TimeStamp']

Final_Status = []

for i in time_entry:
    Final_Status.append(df.loc[df['TimeStamp'] == i, ['Status']])

Final_Status

>> output
[  Status
3    OUT,   Status
6    OUT,   Status
5     IN,   Status
7     IN]

问题:

我得到了一个奇怪的“Final_Status”列表。 它有标题和索引与列表值

[ 状态 3 外部, 状态 6 外部, 状态 5 内部, 状态 7 内部]

这不允许我从列表中计算“内部”的数量,即Final_Status.count('内部')不能工作。

任何其他更聪明的解决这个问题的方法也是可行的。

2个回答

2
import pandas as pd

df = pd.DataFrame({
                    'Emp_id': [121,321,451,121,
                               451,451,321,755],
                    'TimeStamp': ['29-07-2019 08:55:55','29-07-2019 09:02:55','29-07-2019 09:05:50','29-07-2019 10:05:50',
                                  '29-07-2019 10:07:50','29-07-2019 10:10:10','29-07-2019 10:20:10','29-07-2019 11:00:00'],
                    'Status': ['IN','IN','IN','OUT','OUT','IN','OUT','IN']
})

#Convert strings to pandas datetime object
df['TimeStamp'] = pd.to_datetime(df['TimeStamp'])

#Group by employee id
groups = df.groupby('Emp_id')

Final_Status = []
for name, group in groups:
    status = group.loc[group.TimeStamp.argmax(), 'Status']
    Final_Status.append(status)

谢谢 @Alex。使用idxmax()代替argmax(),它表现得完美无缺,正如我所期望的,我更喜欢你的方法。感谢你的帮助! - Vivi

1

我刚刚修改了你的代码,使计数工作。

我在groupby函数中添加了参数as_index = False,因为我们不需要索引来获取每个用户的最后一个最大时间。

对于Final_list的创建,首先我像你一样选择行和列。然后使用参数值(去掉标题)获取值。然后将其转换为列表(仅包含1个字符串“In”或“Out”的列表),并取第一个元素,这将是所需的字符串。

最后两行只是用来打印结果的。

这是最终脚本。(这不是最好的方法,但它能够工作)

import pandas as pd


df = pd.DataFrame({
                    'Emp_id': [121,321,451,121,
                               451,451,321,755],
                    'TimeStamp': ['29-07-2019 08:55:55','29-07-2019 09:02:55',
                                  '29-07-2019 09:05:50','29-07-2019 10:05:50',
                                  '29-07-2019 10:07:50','29-07-2019 10:10:10',
                                  '29-07-2019 10:20:10','29-07-2019 11:00:00'],
                    'Status': ['IN','IN','IN','OUT','OUT','IN','OUT','IN']
})

print(df)

# OUTPUT
#   Emp_id            TimeStamp Status
#0     121  29-07-2019 08:55:55     IN
#1     321  29-07-2019 09:02:55     IN
#2     451  29-07-2019 09:05:50     IN
#3     121  29-07-2019 10:05:50    OUT
#4     451  29-07-2019 10:07:50    OUT
#5     451  29-07-2019 10:10:10     IN
#6     321  29-07-2019 10:20:10    OUT
#7     755  29-07-2019 11:00:00     IN

time_entry = df[['Emp_id',
                 'TimeStamp']].groupby(['Emp_id'],
                 as_index=False).max()['TimeStamp']

Final_Status = []

for i in time_entry:
    Final_Status.append(df.loc[df['TimeStamp'] == i]['Status'].values.tolist()[0])

print(Final_Status)
#OUTPUT
# ['OUT', 'OUT', 'IN', 'IN']
print(Final_Status.count('IN'))
#OUTPUT
# 2

请同时添加您所做的更改和其工作方式的描述。 - Romil Patel
1
@PatelRomil,我刚刚更新了我的回答,并加上了所有的解释。 - Skander HR
@[Skander HR] 感谢您纠正我的代码。按照您指出的修改,它现在运作良好 :) - Vivi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接