一个样本系列的resample()DataFrame,同时在DataFrame中复制所有其他系列的值

时间:2019-03-22 16:30:42

标签: pandas

我想对DataFrame中的一个系列进行重新采样,其中DataFrame中的所有其他系列对于每个索引都具有相同的数据。我可以对一个系列进行重新采样,但是如何复制数据呢?

设置

如果我以df开头:

                    value    data_1 data_2  data_3  data_4
effective_date                                            
2018-7-31        4.010784  17901701   3mra  Actual    0.01
2018-8-31        2.044298  17901701   3mra  Actual    0.01
2018-10-31      11.493831  17901701   3mra  Actual    0.01
2018-11-30      13.929844  17901701   3mra  Actual    0.01
2018-12-31      21.500490  17901701   3mra  Actual    0.01

并要在9月日期中添加一个值0,所有其他数据保持不变:

                    value    data_1 data_2  data_3  data_4
effective_date                                            
2018-7-31        4.010784  17901701   3mra  Actual    0.01
2018-8-31        2.044298  17901701   3mra  Actual    0.01
2018-9-30        0.000000  17901701   3mra  Actual    0.01
2018-10-31      11.493831  17901701   3mra  Actual    0.01
2018-11-30      13.929844  17901701   3mra  Actual    0.01
2018-12-31      21.500490  17901701   3mra  Actual    0.01

到目前为止的代码

我可以使用以下代码对value进行重新采样:

df.value.resample('M').first().fillna(0)

获得:

effective_date
2018-07-31     4.010784
2018-08-31     2.044298
2018-09-30     0.000000
2018-10-31    11.493831
2018-11-30    13.929844
2018-12-31    21.500490

将其他值复制到df的最有效方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用resample对整个DataFrame进行重新采样,然后用0和ffill的所有其他列填充“值”列的NA:

df.resample('M').first().fillna({'value': 0}).ffill()

输出:

                    value      data_1 data_2  data_3  data_4
effective_date                                              
2018-07-31       4.010784  17901701.0   3mra  Actual    0.01
2018-08-31       2.044298  17901701.0   3mra  Actual    0.01
2018-09-30       0.000000  17901701.0   3mra  Actual    0.01
2018-10-31      11.493831  17901701.0   3mra  Actual    0.01
2018-11-30      13.929844  17901701.0   3mra  Actual    0.01
2018-12-31      21.500490  17901701.0   3mra  Actual    0.01

答案 1 :(得分:1)

resample之后,您可以通过where

来更改值
s=df.resample('M').ffill()
s.value=s.value.where(s.index.isin(df.index),0)
s
Out[249]: 
                    value    data_1 data_2  data_3  data_4
effective_date                                            
2018-07-31       4.010784  17901701   3mra  Actual    0.01
2018-08-31       2.044298  17901701   3mra  Actual    0.01
2018-09-30       0.000000  17901701   3mra  Actual    0.01
2018-10-31      11.493831  17901701   3mra  Actual    0.01
2018-11-30      13.929844  17901701   3mra  Actual    0.01
2018-12-31      21.500490  17901701   3mra  Actual    0.01