提问人:Fakir 提问时间:8/29/2019 最后编辑:Fakir 更新时间:8/29/2019 访问量:164
计算唯一日期数以计算 ocuurance [重复]
counting unique number of dates to count ocuurance [duplicate]
问:
想要查找与一组值对应的唯一日期数。如果 Col1、Col2、Col3 的值相同,则有多少个实例。 我只能用年、月或日来做,但想把所有的东西结合起来,这样我就可以找到每个唯一的日期(yyyy/mm/dd)。
BldgID BldgHt Device Date
108 28 760 2018/9/18
108 28 760 2018/10/5
108 28 760 2018/10/18
108 28 760 2018/10/19
104 36 758 2018/10/2
104 36 758 2018/11/2
104 41 758 2018/9/13
104 41 758 2018/10/3
104 41 758 2018/10/16
104 41 758 2018/10/25
104 41 758 2018/11/3
104 41 758 2018/11/7
104 45 758 2018/10/3
104 45 758 2018/11/3
通过将 dt.month 更改为 dt.year 或 dt.day,我可以明智地获得年、月或日,但希望整个日期明智。
df_test = df.Date.apply(lambda dt: dt.date()).groupby\
([df.BldgID, df.BldgHt, df.Device, df.Date.apply(lambda dt:\
dt.month)]).nunique()
df_test.head(10)
以下是按月值。
BldgID BldgHt Device Date
108 28.0 760 9 1
10 3
104 36.0 758 10 1
11 1
41.0 758 9 1
758 10 3
758 11 2
45.0 758 10 1
45.0 758 11 1
Name: Date, dtype: int64
期望输出:
BldgID BldgHt Device Total_count
108 28.0 760 4
104 36.0 758 2
41.0 758 6
104 45.0 758 2
Total_count 是每组相应唯一值的计数的总和 'BldgID、BldgHt、设备”。
提前致谢。
答:
2赞
moys
8/29/2019
#1
df.groupby(['BldgID','BldgHt','Device'], sort=False)['Date'].size().reset_index()
输出
BldgID BldgHt Device Date
0 108 28 760 4
1 104 36 758 2
2 104 41 758 6
3 104 45 758 2
评论
0赞
Fakir
8/29/2019
谢谢。顺便说一句,只需将 .reset_index() 添加到第二个 ans,它就会给出与您的相同的 ans。sort 和 size() 有什么好处。你能说出来吗?
0赞
moys
8/29/2019
默认情况下,排序是 ,所以如果你不把它设为 false,你的数据和输出的顺序就会不同。 包括 NaN 值,不:True
size()
count()
3赞
Constanza Garcia
8/29/2019
#2
添加到已经很好的答案中
df.groupby(['BldgID','BldgHt','Device'])['Date'].count()
评论
0赞
Fakir
8/29/2019
谢谢。这就是我想要的。
0赞
bexi
8/29/2019
这个答案适用于您给定的样本。请注意,如果组中有重复的日期,这将不会给出所需的结果。
0赞
Fakir
8/29/2019
你的意思是,即使 ['BldgID','BldgHt','Device'] 不同但 'Date' 相同,它也不会起作用?那么这可能是一个问题。
0赞
bexi
8/29/2019
不,我的意思是,如果在同一组中,您有两次相同的日期,则该方法将计算两次。但是您似乎对独特的日期感兴趣,因此它们应该只计算一次。['BldgID','BldgHt','Device']
count()
0赞
Fakir
9/10/2019
谢谢。明白了。有一个任务。如果我使用带有第 5 列(“结果”)的“BldgID, BldgHt, Device”分组,但想保留第 4 列“Date”,因为它在 df 中。能做到吗?想要使用第一个 3 val 分组,然后使用相应的“Date”列。 令人困惑的问题?
4赞
bexi
8/29/2019
#3
接下来的解决方法对我有用。让我们先生成您的数据:
df = pd.DataFrame({'BldgID': [108, 108, 108, 108, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104], 'BldgHt': [28, 28, 28, 28, 36, 36, 41, 41, 41, 41, 41, 41, 45, 45], 'Device': [760, 760, 760, 760, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758], 'Date': ['2018/9/18', '2018/10/5', '2018/10/18', '2018/10/19', '2018/10/2', '2018/11/2', '2018/9/13', '2018/10/3', '2018/10/16', '2018/10/25', '2018/11/3', '2018/11/7', '2018/10/3', '2018/11/3',]})
df['Date'] = df['Date'].apply(lambda x: pd.to_datetime(x))
现在,您可以执行以下操作:
df2 = df.groupby(['BldgID', 'BldgHt', 'Device'])['Date'].nunique()
这给了:
print(df2)
BldgID BldgHt Device
104 36 758 2
41 758 6
45 758 2
108 28 760 4
编辑:
如果要重命名问题中指定的列,可以按如下方式实现:
df2 = df2.reset_index(drop=False).rename(columns={'Date': 'Total_count'})
或者更优雅地说:
df2 = df2.reset_index(name='Total_count')
评论
0赞
Fakir
8/29/2019
谢谢。它可能会起作用。但我有大约 70,000 个唯一的 BldgID 号码。
0赞
Fakir
8/29/2019
多谢。您编辑的答案使解决方案成为一个完整的解决方案。
评论
count
bexi