将计数列添加到Pandas数据透视表

时间:2019-01-25 17:49:11

标签: python pandas pivot-table

我有一个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

1 个答案:

答案 0 :(得分:0)

假设您的dates_weeklycb数据帧按日期排序:

# 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')