cqwcns 发表于 2021-1-14 15:36

python pandas多条件计数的问题

python pandas有个DataFrame,内容如图,我现在要统计人员签到的天数,因为有同一天签到多次的情况,我不能直接计算['姓名']的数量。
各位大佬有什么实现的思路,给点灵感,谢谢。


沉默的工作者 发表于 2021-1-14 15:49

统一把时间改成年月日的形式,然后去重,再进行计算就行了

sz090955 发表于 2021-1-14 16:02

用resample()把时间分组,再unique、count,或者如果时间是str就apply生成一个"yyyy-mm-dd"的时间,再unique、count

rsnodame 发表于 2021-1-15 08:40

resample方法对时间数据重采样,然后再想办法{:301_991:}

cqwcns 发表于 2021-1-15 09:35

rsnodame 发表于 2021-1-15 08:40
resample方法对时间数据重采样,然后再想办法

我的实现代码,欢迎大佬拍砖。

# ######第一部分,统计人员签到天数######
# 格式化日期
df_sign_in['打卡时间'] = pd.to_datetime(df_sign_in['打卡时间'])
# 新增[签到日期]列
df_sign_in['签到日期'] = df_sign_in.apply(lambda x: x['打卡时间'].strftime("%Y-%m-%d"), axis=1)
# 获取关键字段,参加一个新DataFrame
df_sign_in_drop_duplicates = df_sign_in.loc[:, ['姓名', '签到日期']]
# 去重
df_sign_in_drop_duplicates = df_sign_in_drop_duplicates.drop_duplicates()
# 创建人员签到天数字典
dict_sign_in_days = dict(Counter(df_sign_in_drop_duplicates['姓名']))
# 字典结构是这样的{'蔡海明': 10, '蔡向兴': 1, '曹福茂': 11, '曹福云': 10, '曹天贵': 11......
print(dict_sign_in_days)

# ######第二部分,应用数据######

# 获得签到天数
def func_sign_in_Days(x):
    if x['姓名'] in dict_sign_in_days:
      return dict_sign_in_days]
    else:
      return 0

# 获得人员签到天数
df_personnel['签到天数'] = df_personnel.apply(lambda x: func_sign_in_Days(x), axis=1)

rsnodame 发表于 2021-1-15 11:20

cqwcns 发表于 2021-1-15 09:35
我的实现代码,欢迎大佬拍砖。

# ######第一部分,统计人员签到天数######
...

感觉太复杂了。“打卡时间”时间序列化之后,用resample('D')的方法可以直接按照天做重采样,类似一种针对时间优化过的分组操作,然后你直接对每个姓名对应有几天计数就行

Cool_Breeze 发表于 2021-1-15 11:34

首先把打卡记录分成 日期, 时间 两个部分(字符串分割,按 空格分割),只保留日期部分
把名字相同的打卡日期加入 一个列表, 最后 将列表转为集合(set(list)), len(转换后集合),ok!
页: [1]
查看完整版本: python pandas多条件计数的问题