【问题标题】:How to get rid of headers and index from the Python list?如何摆脱 Python 列表中的标题和索引?
【发布时间】:2019-07-29 22:32:46
【问题描述】:

我基本上是在尝试从 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”分组并找到它的 max(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 IN,状态 7 英寸]

这并不能让我从列表中计算“IN”,即 Final_Status.count('IN') 不工作。

也感谢任何其他更聪明的方法来解决这个问题。

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:
    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() 它可以完美地按照我的意愿工作,我更喜欢你的方法。感谢您的帮助!
    【解决方案2】:

    我刚刚对您的代码进行了一些修改以使计数起作用。

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

    为了创建 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
    

    【讨论】:

    • 另外,请添加对您所做更改及其工作方式的说明
    • @PatelRomil 我刚刚用所有解释更新了我的答案
    • @[Skander HR] 感谢您更正我的代码。在您指出的更正后它运行良好:)
    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    相关资源
    最近更新 更多