熊猫groupby:返回不同的索引

亚历克斯·波卡(Alex Poca)
Versions:
* Pandas 0.21.0
* Python 2.7.12

我在Pandas中看到了这种奇怪的行为:根据数据框和排序,groupby返回不同的结果:

import pandas as pd
from datetime import datetime

df1 = pd.DataFrame({'dtime': [datetime(2017,1,1,1,5), datetime(2017,1,1,1,20)],
                   'val1': [11, None],
                   'val2': [None, 31]
                  })

df2 = pd.DataFrame({'dtime': [datetime(2017,1,1,1,5), datetime(2017,1,1,1,20)],
                   'val1': [11, None],
                   'val2': [31, None]
                  })



df1b = df1.melt("dtime").dropna().set_index("dtime")
df2b = df2.melt("dtime").dropna().set_index("dtime")

r1a = df1b.groupby(pd.Grouper(freq="1h")).value.apply(lambda x: x.sort_values(ascending=True))
r1b = df1b.groupby(pd.Grouper(freq="1h")).value.apply(lambda x: x.sort_values(ascending=False))

r2a = df2b.groupby(pd.Grouper(freq="1h")).value.apply(lambda x: x.sort_values(ascending=True))
r2b = df2b.groupby(pd.Grouper(freq="1h")).value.apply(lambda x: x.sort_values(ascending=False))

print "\n--- df1 ascending sort ---------------\n", r1a
print "\n--- df1 descending sort SHOULD IT ALWAYS BE LIKE THIS? --------------\n", r1b
print "\n--- df2 ascending sort ---------------\n", r2a
print "\n--- df2 descending sort --------------\n", r2b

返回

--- df1 ascending sort ---------------
dtime
2017-01-01 01:05:00    11.0
2017-01-01 01:20:00    31.0
Name: value, dtype: float64

--- df1 descending sort SHOULD IT ALWAYS BE LIKE THIS? --------------
dtime                dtime              
2017-01-01 01:00:00  2017-01-01 01:20:00    31.0
                     2017-01-01 01:05:00    11.0
Name: value, dtype: float64

--- df2 ascending sort ---------------
dtime
2017-01-01 01:05:00    11.0
2017-01-01 01:05:00    31.0
Name: value, dtype: float64

--- df2 descending sort --------------
dtime
2017-01-01 01:05:00    31.0
2017-01-01 01:05:00    11.0
Name: value, dtype: float64

为什么df1 descending sort返回分组(2017-01-01 01:00:00的参考时间,而其他分组却没有?我希望所有分组都会毫无例外地将参考时间返回为多索引。

我在github pandas#18908创建了一个问题,但是一个月之内没有任何有用的答案。我想了解这仅仅是演示问题还是可能的错误。我想念什么吗?

菲尔·谢德

在Python 3.5和Pandas 0.22上进行了测试-使用略有不同的代码(pd.melt()而不是df.melt)。

首先-差异的原因。

df1 具有两个不同时间戳(01:20:00和01:05:00)的值,其中df2剩下的两个观测值都在同一时间戳(01:05:00)上。

我不确定为什么,但是很显然,反转排序方式的行为确实意味着该.values呼叫包括了分组时间窗口,df1因为您正在按升序在时间索引内对值进行降序排序。结果有所不同,df2因为时间戳相同,因此不需要石斑鱼。您可能已经推断出了这一点,因此对重复表示歉意。

建议始终如一地显示您的预期结果

通常,在使用时,pandas.DataFrame.groupby我将使用聚合调用来操纵数据(max在下面的示例中,但sumcount其他可用)。如果您希望通过石斑鱼的参考时间来查看自己的值,可以采用以下方法:

这是df1b,针对观察值具有多个时间戳:

In []: df1b.groupby([pd.Grouper(freq="1h"), df1b.index, "variable"])\
       .max().sort_values("value", ascending=False)
Out[]:
                                                  value
dtime               dtime               variable
2017-01-01 01:00:00 2017-01-01 01:20:00 val2       31.0
                    2017-01-01 01:05:00 val1       11.0    

...和df2b的相同方法:

In []: df2b.groupby([pd.Grouper(freq="1h"), df2b.index, "variable"])\
       .max().sort_values("value", ascending=False)
Out[]:
                                                  value
dtime               dtime               variable
2017-01-01 01:00:00 2017-01-01 01:05:00 val2       31.0
                                        val1       11.0

这有帮助吗?还是我错过了您为什么使用该.values方法的重要性

免责声明:我不熟悉与之合作,groupby.value因此您可能正在尝试实现我错过的目标。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章