我有一个包含超过150,000条电视节目数据记录的数据集,数十个频道,但并非所有频道都有所有日期的数据。
我想按频道,年份和月份对它们进行分组,计算每个月有多少天有每个频道的记录。
这是数据框的一小部分
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个月获得了一个频道的结果。
但我想要的是计算每个月每个频道有多少分明的天数。
对于上面的例子,我有
WBT | 2014 | 12 | 31
我正在使用python 3.5.2和Pandas 0.19.1。
感谢您的任何建议。
答案 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())