在 pandas groupby上发布了一个新的更通用的问题:每个组中的前3个值并存储在DataFrame中,并且在那里已经找到了可行的解决方案。
在此示例中,我创建了一个数据帧df
,其中的一些随机数据间隔为5分钟。我想创建一个数据框gdf
( df分组 ),其中列出了每小时的
3个最高值 。
即:从这一系列价值
VAL
TIME
2017-12-08 00:00:00 29
2017-12-08 00:05:00 56
2017-12-08 00:10:00 82
2017-12-08 00:15:00 13
2017-12-08 00:20:00 35
2017-12-08 00:25:00 53
2017-12-08 00:30:00 25
2017-12-08 00:35:00 23
2017-12-08 00:40:00 21
2017-12-08 00:45:00 12
2017-12-08 00:50:00 15
2017-12-08 00:55:00 9
2017-12-08 01:00:00 13
2017-12-08 01:05:00 87
2017-12-08 01:10:00 9
2017-12-08 01:15:00 63
2017-12-08 01:20:00 62
2017-12-08 01:25:00 52
2017-12-08 01:30:00 43
2017-12-08 01:35:00 77
2017-12-08 01:40:00 95
2017-12-08 01:45:00 79
2017-12-08 01:50:00 77
2017-12-08 01:55:00 5
2017-12-08 02:00:00 78
2017-12-08 02:05:00 41
2017-12-08 02:10:00 10
2017-12-08 02:15:00 10
2017-12-08 02:20:00 88
我非常接近解决方案,但我找不到最后一步的正确语法。我到现在为止(largest3
)的结果是:
VAL
TIME TIME
2017-12-08 00:00:00 2017-12-08 00:10:00 82
2017-12-08 00:05:00 56
2017-12-08 00:25:00 53
2017-12-08 01:00:00 2017-12-08 01:40:00 95
2017-12-08 01:05:00 87
2017-12-08 01:45:00 79
2017-12-08 02:00:00 2017-12-08 02:20:00 88
2017-12-08 02:00:00 78
2017-12-08 02:05:00 41
我想从中获取此信息gdf
(达到每个最大值的时间并不重要):
VAL1 VAL2 VAL3
TIME
2017-12-08 00:00:00 82 56 53
2017-12-08 01:00:00 95 87 79
2017-12-08 02:00:00 88 78 41
这是代码:
import pandas as pd
from datetime import *
import numpy as np
# test data
df = pd.DataFrame()
date_ref = datetime(2017,12,8,0,0,0)
days = pd.date_range(date_ref, date_ref + timedelta(0.1), freq='5min')
np.random.seed(seed=1111)
data1 = np.random.randint(1, high=100, size=len(days))
df = pd.DataFrame({'TIME': days, 'VAL': data1})
df = df.set_index('TIME')
print(df)
print("----")
# groupby
group1 = df.groupby(pd.Grouper(freq='1H'))
largest3 = pd.DataFrame(group1['VAL'].nlargest(3))
print(largest3)
gdf = pd.DataFrame()
# ???? <-------------------
先感谢您。
注意:仅当每个组至少有3行时,此解决方案才有效
请尝试以下方法:
In [59]: x = (df.groupby(pd.Grouper(freq='H'))['VAL']
.apply(lambda x: x.nlargest(3))
.reset_index(level=1, drop=True)
.to_frame('VAL'))
In [60]: x
Out[60]:
VAL
TIME
2017-12-08 00:00:00 82
2017-12-08 00:00:00 56
2017-12-08 00:00:00 53
2017-12-08 01:00:00 95
2017-12-08 01:00:00 87
2017-12-08 01:00:00 79
2017-12-08 02:00:00 88
2017-12-08 02:00:00 78
2017-12-08 02:00:00 41
In [61]: x.set_index(np.arange(len(x)) % 3, append=True)['VAL'].unstack().add_prefix('VAL')
Out[61]:
VAL0 VAL1 VAL2
TIME
2017-12-08 00:00:00 82 56 53
2017-12-08 01:00:00 95 87 79
2017-12-08 02:00:00 88 78 41
一些解释:
In [94]: x.set_index(np.arange(len(x)) % 3, append=True)
Out[94]:
VAL
TIME
2017-12-08 00:00:00 0 82
1 56
2 53
2017-12-08 01:00:00 0 95
1 87
2 79
2017-12-08 02:00:00 0 88
1 78
2 41
In [95]: x.set_index(np.arange(len(x)) % 3, append=True)['VAL'].unstack()
Out[95]:
0 1 2
TIME
2017-12-08 00:00:00 82 56 53
2017-12-08 01:00:00 95 87 79
2017-12-08 02:00:00 88 78 41
问题内容: 我在csv文件中有这样的数据 我可以像这样阅读和分组 我懂了 我希望这个(顺序无所谓) 我想知道是否有可能算零次 问题答案: 你可以用与: 如果您需要使用输出:
问题内容: 我经常使用pandas groupby生成堆积表。但是然后我经常想将生成的嵌套关系输出到json。有什么方法可以从生成的堆叠表中提取嵌套的json文件吗? 假设我有一个df,例如: 我可以: 美丽!当然,我真正想做的是通过命令沿着grouped.to_json嵌套嵌套的json。但是该功能不可用。任何解决方法? 所以,我真正想要的是这样的: 唐 问题答案: 我认为熊猫没有内置任何东西可
问题内容: 我有一个包含以下信息的数据框: 我想根据索引插入数据帧中的值, 但仅在每个文件组中 。 插值,我通常会做 和我一起做 我希望插入的数据帧看起来像这样: NaN仍然存在于t = 6的位置,因为它们是file2组中的第一项。 我怀疑我需要使用“应用”,但是还无法确切地知道如何… 任何帮助,将不胜感激。 问题答案:
我必须根据以下col1、col2和loc的数据进行分组,并计算col3中的项数。此外,还应考虑开始和结束日期,即日期应在2021 1月1日至2021 1月31日之间。最终结果应显示在col4中。 数据 预期输出
问题内容: 我正在尝试使用具有相似列值的行来估算值。 例如,我有这个数据框 我想使用相似的列[‘one’]和[‘two’]的键,并且如果列[‘three’]并非完全是nan,则从具有相似的键的行中插值[ ‘3’] 这是我的愿望结果 您会看到键1和3不包含任何值,因为现有值不存在。 我试过使用groupby fillna() 这给了我一个错误。 我尝试了正向填充,这给了我一个相当奇怪的结果,那就是它
问题内容: 我有一个看起来像这样的DataFrame: 我想将其转换为对属于某些bin的视图进行计数,如下所示: 我试过了: 但它仅提供汇总计数,而不提供用户计数。如何获得用户的垃圾箱计数? 总计计数(使用我的真实数据)如下所示: 问题答案: 您可以按垃圾箱 和 用户名分组,计算分组大小,然后使用: