gpt4 book ai didi

python - Pandas 重采样器键错误

转载 作者:行者123 更新时间:2023-11-28 19:08:53 24 4
gpt4 key购买 nike

我在 StackOverflow 上的第一个问题。直到现在,我总是能够通过搜索找到问题的答案。希望不要因为问重复的问题而让自己难堪。

我正在对 Pandas 数据框进行重采样。然后我想遍历重采样器对象中的数据帧以提取一些信息。

但是,当我使用 resampler.groups.keys() 返回的键时,如果该周没有数据,我会收到一个键错误。这对我来说似乎不一致。我本以为会得到一个空的数据框或 keys() 方法,或者根本得不到那一周的组的 key 。

import pandas as pd

df = pd.read_csv('debug.csv', index_col = 'DATETIME', parse_dates=True)

by_week = df.resample('W-SUN')
by_week.groups

给予:

{Timestamp('2017-02-26 00:00:00', offset='W-SUN'): 1,
Timestamp('2017-03-05 00:00:00', offset='W-SUN'): 1,
Timestamp('2017-03-12 00:00:00', offset='W-SUN'): 1,
Timestamp('2017-03-19 00:00:00', offset='W-SUN'): 8}

然后求和只是为了显示中间两周没有数据:

print by_week.sum()

ID DATA
DATETIME
2017-02-26 1020754.0 74.0
2017-03-05 NaN NaN
2017-03-12 NaN NaN
2017-03-19 7151408.0 2526.0

显示重采样器组的键:

for key in sorted(by_week.groups.keys(), reverse=True):
print key

2017-03-19 00:00:00
2017-03-12 00:00:00
2017-03-05 00:00:00
2017-02-26 00:00:00

尝试为每个组数据框做一些事情。第一周还好,第二周就不行了。为什么 keys() 方法返回无效 key ?

for key in sorted(by_week.groups.keys(), reverse=True):
df = by_week.get_group(key)
print df.head()

ID DATA
DATETIME
2017-03-18 22:41:10.859 1021626 384
2017-03-18 23:45:18.773 1021627 375
2017-03-18 23:45:35.309 1021628 359
2017-03-18 23:46:45.303 1021629 188
2017-03-19 01:02:23.554 1021633 373


---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-6-a57723281f49> in <module>()
1 for key in sorted(by_week.groups.keys(), reverse=True):
----> 2 df = by_week.get_group(key)
3 print df.head()

//anaconda/lib/python2.7/site-packages/pandas/core/groupby.pyc in get_group(self, name, obj)
585 inds = self._get_index(name)
586 if not len(inds):
--> 587 raise KeyError(name)
588
589 return obj.take(inds, axis=self.axis, convert=False)

KeyError: Timestamp('2017-03-12 00:00:00', offset='W-SUN')

我的解决方法如下。如果有更合适的方法来处理这个问题,也感谢任何反馈。这会跳过没有数据的中间两周。有没有从根本上更好的方法来迭代每周的数据?

for key in sorted(by_week.groups.keys(), reverse=True):
try:
df = by_week.get_group(key)
except:
continue
print df.head()

ID DATA
DATETIME
2017-03-18 22:41:10.859 1021626 384
2017-03-18 23:45:18.773 1021627 375
2017-03-18 23:45:35.309 1021628 359
2017-03-18 23:46:45.303 1021629 188
2017-03-19 01:02:23.554 1021633 373
ID DATA
DATETIME
2017-02-21 13:42:01.133 1020754 74

编辑/更新:解决以下关于使用内置迭代器的响应。我的原始代码确实使用了内置的迭代器,但我明白了。

import pandas as pd
df = pd.read_csv('debug.csv', index_col = 'DATETIME', parse_dates=True)
by_week = df.resample('W-SUN')

for key, df in by_week:
print df.head()

给出:

Traceback (most recent call last):
File "debug_sampler.py", line 10, in <module>
for key, df in by_week:
File "<redacted path>/pandas/core/groupby.py", line 600, in __iter__
return self.grouper.get_iterator(self.obj, axis=self.axis)
AttributeError: 'NoneType' object has no attribute 'get_iterator'

有趣的是,如果我改为使用 groupby,那就没问题了。但我不想放弃重采样方法的便利性(例如,在任意一天结束的一周内重采样)。

import pandas as pd
df = pd.read_csv('debug.csv', index_col = 'DATETIME', parse_dates=True)

by_week_groupby = df.groupby(lambda x: x.week)

for key, df in by_week_groupby:
print df.head()

给出:

                              ID  DATA
DATETIME
2017-02-21 13:42:01.133 1020754 74
ID DATA
DATETIME
2017-03-19 17:01:01.352 1021625 428
2017-03-18 22:41:10.859 1021626 384
2017-03-18 23:45:18.773 1021627 375
2017-03-18 23:45:35.309 1021628 359
2017-03-18 23:46:45.303 1021629 188

安装的pandas版本:

print pd.__version__
0.18.1

最佳答案

当 pandas 已经有了一个对象时(虽然不明显),不要通过 groupby 对象强制你自己的迭代

for key, df in byweek:
print(df.head())

关于python - Pandas 重采样器键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42941252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com