数据集在pandas数据框中每月有多少天记录?

时间:2016-12-11 22:21:16

标签: python pandas dataframe

我有一个包含超过150,000条电视节目数据记录的数据集,数十个频道,但并非所有频道都有所有日期的数据。

我想按频道,年份和月份对它们进行分组,计算每个月有多少天有每个频道的记录。

这是数据框的一小部分

enter image description here

df = pd.DataFrame(
    {"channel": {"631": "CBR", "632": "CBR", "633": "CBR"}, "year": {"631": "2014", "632": "2014", "633": "2014"},
     "month": {"631": "01", "632": "01", "633": "01"}, "day": {"631": "06", "632": "06", "633": "06"},
     "t1": {"631": 1388967300000, "632": 1388973300000, "633": 1388974500000},
     "title": {"631": "title 1", "632": "title 2", "633": "title 3"}})

我以这种方式尝试过群组

grouped = df.groupby(['channel', 'year','month', 'day']).count().reset_index()

所以我在第12个月获得了一个频道的结果。

enter image description here

但我想要的是计算每个月每个频道有多少分明的天数。

对于上面的例子,我有

WBT | 2014 | 12 | 31

我正在使用python 3.5.2和Pandas 0.19.1。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

In [110]: df.groupby(['channel','year','month'])['day'].apply(lambda x: len(x.unique()))
Out[110]: 
channel  year  month
CBR      2014  01       1
Name: day, dtype: int64

或者,正如@MaxU和@TedPetrou所建议的,您可以使用.nunique(),如下所示:

In [5]: df.groupby(['channel','year','month'])['day'].nunique()
Out[5]: 
channel  year  month
CBR      2014  01       1
Name: day, dtype: int64

nunique()似乎是性能方面的明智选择,见下文:

In [6]: %timeit df.groupby(['channel','year','month'])['day'].apply(lambda x: len(x.unique()))
The slowest run took 4.39 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 4.42 ms per loop

In [7]: %timeit df.groupby(['channel','year','month'])['day'].nunique()
100 loops, best of 3: 2.05 ms per loop

答案 1 :(得分:0)

# not add 'day' in groupby 
bydays = df.groupby(['channel','year','month'])

print(bydays['day'].count())