像其他人一样,我对你想要的东西有点困惑。
您的输出是01
代码的总和,每组代码为id
,而不是平均值。你在上一个陈述中表达得太多,这有点难以理解。为什么不简单明了?
你可以先预处理数据:
(1)输入
data=[
['2017-06-26 09:00:00',4015,558460648326103043],
['2017-06-26 09:05:00',4015,13721946658181148],
['2017-06-26 09:10:00',4015,288298648959188992],
['2017-06-26 09:15:00',4015,27023247031744576],
['2017-06-26 09:20:00',4015,435887716434584],
['2017-06-26 09:25:00',4015,2147614720],
['2017-06-26 09:00:00',4014,558451851700273155],
['2017-06-26 09:05:00',4014,13721941188808728],
['2017-06-26 09:10:00',4014,288263395867623424],
['2017-06-26 09:15:00',4014,18016047776938080],
['2017-06-26 09:20:00',4014,145547927225032],
['2017-06-26 09:25:00',4014,3221356544]
]
df = pd.DataFrame(data, columns=['captureTime', 'id', 'digits'])
# convert datetime
df['captureTime'] = pd.to_datetime(df.captureTime)
"""
(2)计数'01'
为digits
df['counts01'] = df.digits.apply(
lambda x:format(x%2**60,'060b').count('01'))
# output
captureTime id digits counts01
0 2017-06-26 09:00:00 4015 558460648326103043 8
1 2017-06-26 09:05:00 4015 13721946658181148 9
2 2017-06-26 09:10:00 4015 288298648959188992 4
3 2017-06-26 09:15:00 4015 27023247031744576 5
4 2017-06-26 09:20:00 4015 435887716434584 8
5 2017-06-26 09:25:00 4015 2147614720 2
6 2017-06-26 09:00:00 4014 558451851700273155 8
7 2017-06-26 09:05:00 4014 13721941188808728 8
8 2017-06-26 09:10:00 4014 288263395867623424 4
9 2017-06-26 09:15:00 4014 18016047776938080 4
10 2017-06-26 09:20:00 4014 145547927225032 8
11 2017-06-26 09:25:00 4014 3221356544 2
现在你可以将任何类型的聚合功能。
(1)如果要为每个id
平均值:
df.groupby('id')['counts01'].mean()
#output
id
4014 5.666667
4015 6.000000
为了您的最后声明中,equvanient是:
In [27]: df.groupby('id')['counts01'].sum()
Out[27]:
id
4014 34
4015 36
Name: counts01, dtype: int64
显然,这是每个id
组总和。 (2)我不明白你是什么意思'我想计算时间的平均值'。如果你想随着时间的推移进行聚合,你可以先生成一个时间序列(pd.date_range
),然后按照这个时间序列进行分组。
谢谢。
那么你在寻找一个比你有更好的解决方案吗? – otayeby
我看到你的输出,但我很困惑你想要什么。输出不是你想要的吗? – BenT
@tiba我没有计算出平均值。 – ejshin1