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
在下面的示例中,但sum
,count
其他可用)。如果您希望通过石斑鱼的参考时间来查看自己的值,可以采用以下方法:
这是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] 删除。
我来说两句