我有一个Pandas数据框,用于保存部门中笔记本电脑结帐的数据。数据框包含用于检出时间的列(列名Out
),检入时间(In
),检出人员的姓名(Name
)和检出的机器数的列由那个人(Number
退出。我想创建一个新的数据框,以显示给定一周内检出的次数和给定一周内检出的机器数。原始数据帧称为cb
。
我能够创建一个数据透视表,该数据透视表可以让我了解按周检出的计算机数量:
dates = pd.pivot_table(cb, values="Number", index="Out", aggfunc=sum)
我想知道我可以在此代码行中添加什么来添加一个新列,该列用于计算计算机被检出的次数。例如,如果两个人在给定的一周中检出了笔记本电脑,人1检出了10台笔记本电脑,人2检出了5台笔记本电脑,那么本周应该有一个“数字”列,其读数为“ 15”,另一列为“频率”读为“ 2”。
使用单行pivot_table
还是有可能吗?提前致谢。
编辑:这是我希望找到的一个小例子。首先,这是我正在读取的CSV原始数据:
Name Number DateOut TimeOut DateIn TimeIn
C 1 8/31/2017 2:00p 9/1/2017 3:40p
Ma 2 8/31/2017 3:30p . .
S 1 9/6/2017 10:50a 9/6/2017 1:55p
S 3 9/7/2017 10:00a 9/7/2017 3:00p
C 1 9/7/2017 2:20p 9/8/2017 11:00a
Ma 2 9/7/2017 4:00p 9/8/2017 10:00a
S 4 9/8/2017 10:50a 9/8/2017 3:15p
W 6 9/11/2017 8:15a 9/11/2017 11:00a
B 4 9/11/2017 10:45a 9/11/2017 1:00p
S 4 9/11/2017 10:55a 9/11/2017 3:55p
S 3 9/12/2017 12:55p 9/12/2017 3:00p
Ma 2 9/12/2017 4:00p 9/15/2017 10:00a
S 1 9/13/2017 11:00a 9/13/2017 1:00p
T 1 9/13/2017 1:00p . .
K 1 9/13/2017 2:00p 9/14/2017 10:00a
F 2 9/13/2017 4:00p 9/14/2017 11:45a
S 3 9/14/2017 1:00p 9/14/2017 3:00p
C 1 9/14/2017 3:50p 9/15/2017 10:00a
F 4 9/15/2017 9:35a 9/15/2017 3:00p
(为保护隐私,已删除名称。)
读取它的代码(将给定日期解析为正确的DateTime索引):
import pandas as pd
cb = pd.read_csv("chromebookdata.csv", na_values=".",
parse_dates={"In": [2,3], "Out":[4,5]})
cb['In'] = pd.to_datetime(cb['In'], errors="coerce")
cb['Out'] = pd.to_datetime(cb['Out'], errors="coerce")
创建一个数据透视表,以给出每周的机器数量:
dates = pd.pivot_table(cb, values="Number", index="Out", aggfunc=sum)
dates_weekly = dates.resample("W").sum()
此数据透视表显示了我每周检出的计算机数量:
Number
In
2017-09-03 3.0
2017-09-10 11.0
2017-09-17 33.0
我想要的是出现次结帐次数的新列,因此对于这些数据,它看起来像是:
Number Count
In
2017-09-03 3.0 2
2017-09-10 11.0 5
2017-09-17 33.0 12
答案 0 :(得分:0)
假设您的dates_weekly
和cb
数据帧按日期排序:
# Round your dates to the day
cb['dates'] = cb['dates'].dt.floor('d')
# Group by rounded date and count the number of rows per each date
dates_weekly['frequency'] = cb.groupby('dates').agg('count')