考虑以下DataFrame:

                          value
item_uid   created_at          

0S0099v8iI 2015-03-25  10652.79
0F01ddgkRa 2015-03-25   1414.71
0F02BZeTr6 2015-03-20  51505.22
           2015-03-23  51837.97
           2015-03-24  51578.63
           2015-03-25       NaN
           2015-03-26       NaN
           2015-03-27  50893.42
0F02BcIzNo 2015-03-17   1230.00
           2015-03-23   1130.00
0F02F4gAMs 2015-03-25   1855.96
0F02Vwd6Ou 2015-03-19   5709.33
0F04OlAs0R 2015-03-18    321.44
0F05GInfPa 2015-03-16    664.68
0F05PQARFJ 2015-03-18   1074.31
           2015-03-26   1098.31
0F06LFhBCK 2015-03-18    211.49
0F06ryso80 2015-03-16     13.73
           2015-03-20     12.00
0F07gg7Oth 2015-03-19   2325.70

我需要在它们之间的每个日期对两个日期start_dateend_date之间的完整数据帧进行采样,传播最后看到的值。 抽样应在每个item_uid独立/分开进行。

例如,如果我们要在2015-03-202015-03-29之间为0F02BZeTr6进行0F02BZeTr6 ,我们应该得到:

0F02BZeTr6 2015-03-20  51505.22
           2015-03-21  51505.22
           2015-03-22  51505.22
           2015-03-23  51837.97
           2015-03-24  51578.63
           2015-03-25  51578.63
           2015-03-26  51578.63
           2015-03-27  50893.42
           2015-03-28  50893.42
           2015-03-29  50893.42

请注意,我正在向前填充数据框中的NaN 缺少的条目

这个问题解决了类似的问题,但只涉及一个组(即一个级别)。 这个问题反而询问如何在每个组( item_uid )中分别进行相同的操作。 虽然我可以分割输入数据帧并遍历每个组(每个item_uid ),然后将结果拼接在一起,我想知道是否有更高效的东西。

当我执行以下操作时(请参阅此PR ):

dates         = pd.date_range(start=start_date, end=end_date)    
df.groupby(level='itemuid').apply(lambda x: x.reindex(dates, method='ffill'))

我明白了:

TypeError: Fill method not supported if level passed

#1楼 票数:5 已采纳

你有几个选择,最简单的IMO就是简单地拆开第一级然后再填充。 我认为这比使用groupby / resample解决方案更清楚地发生了什么(我怀疑它也会更快,取决于数据):

In [11]: df1['value'].unstack(0)
Out[11]:
item_uid    0F01ddgkRa  0F02BZeTr6  0F02BcIzNo  0F02F4gAMs  0F02Vwd6Ou  0F04OlAs0R  0F05GInfPa  0F05PQARFJ  0F06LFhBCK  0F06ryso80  0F07gg7Oth  0S0099v8iI
created_at
2015-03-16         NaN         NaN         NaN         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN
2015-03-17         NaN         NaN        1230         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN
2015-03-18         NaN         NaN         NaN         NaN         NaN      321.44         NaN     1074.31      211.49         NaN         NaN         NaN
2015-03-19         NaN         NaN         NaN         NaN     5709.33         NaN         NaN         NaN         NaN         NaN      2325.7         NaN
2015-03-20         NaN    51505.22         NaN         NaN         NaN         NaN         NaN         NaN         NaN       12.00         NaN         NaN
2015-03-23         NaN    51837.97        1130         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN
2015-03-24         NaN    51578.63         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN
2015-03-25     1414.71         NaN         NaN     1855.96         NaN         NaN         NaN         NaN         NaN         NaN         NaN    10652.79
2015-03-26         NaN         NaN         NaN         NaN         NaN         NaN         NaN     1098.31         NaN         NaN         NaN         NaN
2015-03-27         NaN    50893.42         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN

如果你错过了一些日期,你必须重新索引(假设开始和结束都存在,否则你可以手动执行此操作,例如使用pd.date_range ):

In [12]: df1['value'].unstack(0).asfreq('D')
Out[12]:
item_uid    0F01ddgkRa  0F02BZeTr6  0F02BcIzNo  0F02F4gAMs  0F02Vwd6Ou  0F04OlAs0R  0F05GInfPa  0F05PQARFJ  0F06LFhBCK  0F06ryso80  0F07gg7Oth  0S0099v8iI
2015-03-16         NaN         NaN         NaN         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN
2015-03-17         NaN         NaN        1230         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN
2015-03-18         NaN         NaN         NaN         NaN         NaN      321.44         NaN     1074.31      211.49         NaN         NaN         NaN
2015-03-19         NaN         NaN         NaN         NaN     5709.33         NaN         NaN         NaN         NaN         NaN      2325.7         NaN
2015-03-20         NaN    51505.22         NaN         NaN         NaN         NaN         NaN         NaN         NaN       12.00         NaN         NaN
2015-03-21         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN
2015-03-22         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN
2015-03-23         NaN    51837.97        1130         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN
2015-03-24         NaN    51578.63         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN
2015-03-25     1414.71         NaN         NaN     1855.96         NaN         NaN         NaN         NaN         NaN         NaN         NaN    10652.79
2015-03-26         NaN         NaN         NaN         NaN         NaN         NaN         NaN     1098.31         NaN         NaN         NaN         NaN
2015-03-27         NaN    50893.42         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN         NaN

注意: asfreq删除索引的名称(这很可能是一个错误!)

现在你可以填写:

In [13]: df1['value'].unstack(0).asfreq('D').ffill()
Out[13]:
item_uid    0F01ddgkRa  0F02BZeTr6  0F02BcIzNo  0F02F4gAMs  0F02Vwd6Ou  0F04OlAs0R  0F05GInfPa  0F05PQARFJ  0F06LFhBCK  0F06ryso80  0F07gg7Oth  0S0099v8iI
2015-03-16         NaN         NaN         NaN         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN
2015-03-17         NaN         NaN        1230         NaN         NaN         NaN      664.68         NaN         NaN       13.73         NaN         NaN
2015-03-18         NaN         NaN        1230         NaN         NaN      321.44      664.68     1074.31      211.49       13.73         NaN         NaN
2015-03-19         NaN         NaN        1230         NaN     5709.33      321.44      664.68     1074.31      211.49       13.73      2325.7         NaN
2015-03-20         NaN    51505.22        1230         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN
2015-03-21         NaN    51505.22        1230         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN
2015-03-22         NaN    51505.22        1230         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN
2015-03-23         NaN    51837.97        1130         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN
2015-03-24         NaN    51578.63        1130         NaN     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7         NaN
2015-03-25     1414.71    51578.63        1130     1855.96     5709.33      321.44      664.68     1074.31      211.49       12.00      2325.7    10652.79
2015-03-26     1414.71    51578.63        1130     1855.96     5709.33      321.44      664.68     1098.31      211.49       12.00      2325.7    10652.79
2015-03-27     1414.71    50893.42        1130     1855.96     5709.33      321.44      664.68     1098.31      211.49       12.00      2325.7    10652.79

并将其堆叠回来(注意:如果要包含起始NaN,则可以使用dropna = False):

In [14]: s = df1['value'].unstack(0).asfreq('D').ffill().stack()

注意:如果索引的排序很重要,您可以切换/排序:

In [15]: s.index = s.index.swaplevel(0, 1)

In [16]: s = s.sort_index()

In [17]: s.index.names = ['item_uid', 'created_at']  # as this is lost earlier

In [18]: s
Out[18]:
item_uid
0F01ddgkRa  2015-03-25     1414.71
            2015-03-26     1414.71
            2015-03-27     1414.71
0F02BZeTr6  2015-03-20    51505.22
            2015-03-21    51505.22
            2015-03-22    51505.22
            2015-03-23    51837.97
            2015-03-24    51578.63
            2015-03-25    51578.63
            2015-03-26    51578.63
            2015-03-27    50893.42
...
0S0099v8iI  2015-03-25    10652.79
            2015-03-26    10652.79
            2015-03-27    10652.79
Length: 100, dtype: float64

这是否比groupby / resample apply解决方案更有效取决于数据。 对于非常稀疏的数据(有很多启动NaN,假设你想放弃它们),我怀疑它不会那么快。 如果数据密集(或者你想保留最初的NaN),我怀疑这个解决方案应该更快。

  ask by Amelio Vazquez-Reina translate from so

未解决问题?本站智能推荐:

1回复

如何有效地重新索引csv数据?

我有一个文件,是从互联网下载的滴答数据。 看起来像这样。 该文件相对“大” 然后,我想重新索引数据,以便可以通过时间类型查询访问它: 我的问题是: 当我在外壳中运行该程序时,即使是一个文件也要花费很多时间。 我确定我的方法一定做错了,因为目标是读取许多文件并将它们
2回复

如何有效地重新索引DataFrame以填充索引列表中的孔?

我有这个DataFrame: 在此DataFrame中, (L1, L2)是ID的元组,而L3是星期数。 我想在DataFrame中添加一些行,以使所有元组的所有可能的星期数都具有默认值: 为了获得此DataFrame,我获得了唯一元组(L1,L2)的列表以及L3的所有值的列表
1回复

重新索引数据框

这很尴尬,我已经这样做了一百万次,但由于某种原因我无法重新reindex这个Dataframe 数据Dataframe df如下所示: 在我重新索引它之后 并打印 df: 如果我说: 不确定我做错了什么?
1回复

重新索引多索引数据框

我有一个 df,其中每个站的时间段的某些日期丢失:如何在多索引 df 中填充每个站的缺失日期并将“值”设置为 NaN? df 看起来像这样: 时间跨度从 01.01.2003 到 31.12.2020。 我试过使用: 但是我得到了输出: 理想情况下,添加的日期将在 LST 列中设置为
1回复

熊猫:在多索引数据框中重新索引和插值

我在理解pandas reindex遇到麻烦。 我进行了一系列测量,并合并到一个多索引df ,我想重新索引和内插这些测量以使其与其他数据对齐。 我的实际数据具有约7个索引级别和几种不同的度量。 我希望这个玩具数据问题的解决方案适用于我的真实数据。 这是“小数据”; 每个单独的测量值
1回复

如何移动熊猫多索引数据帧的级别之一

我有一个像下面这样的数据框,有几个“工业”。 我想将每个“行业”的“交易日”移动 -1(即将 (Agriculture, 2013-02-01) 的所有结果分配给 (Agriculture, 2013-01-31) )。 我怎样才能做到这一点? 编辑:尝试在此处粘贴我的数据框,但粘贴后格式似乎
1回复

重新索引数据帧; 使用多列中的元素填充索引

我有一个Pandas DataFrame,如下所示: 我想做的是重塑DataFrame使其看起来像这样: 换句话说,我想用在所有带有“ I”标签的列(在我的情况下为1到60)中遇到的所有值填充新的DataFrame索引。 但是,我也想暂时保留其余的V列-只要它们仍链接到其原始I
3回复

如何从多索引数据框中返回多个级别/组的值?

这是我的多索引数据框: 数据框如下所示: 我想要实现的是返回Group G1和G2 、 Num 1和3 ,如下所示: 我试过了 但它什么也没显示。 然后我试过了 但它返回 TypeError: '(['G1', 'G2'], [1, 3])' 是一个无效的键。 有什么