计算唯一日期数以计算 ocuurance [重复]

counting unique number of dates to count ocuurance [duplicate]

提问人:Fakir 提问时间:8/29/2019 最后编辑:Fakir 更新时间:8/29/2019 访问量:164

问:

想要查找与一组值对应的唯一日期数。如果 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、设备”。

提前致谢。

python pandas 日期

评论

0赞 jezrael 8/29/2019
检查第二个答案。
0赞 jezrael 8/29/2019
您是否需要或每个组的唯一值数量?count
0赞 Fakir 8/29/2019
谢谢。是的,第二个 ans 是我想要的。
0赞 jezrael 8/29/2019
那么正确就是答案。bexi

答:

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 值,不:Truesize()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
多谢。您编辑的答案使解决方案成为一个完整的解决方案。