Pandas,基于现有的重复计数创建新列

时间:2017-07-07 10:14:45

标签: python pandas

解释起来有点复杂,所以我会尽我所能。我有一个有两列的熊猫:小时(从1到24)和值(对应于每小时)。数据集索引很大,但是在24小时内(从1到24)重复列时间。我正在尝试创建新的24列:值-1,值-2,值-3 ...值-24将对应于每一行和-1小时的值,值从-2小时(从上面的行)开始。

hour | value | value -1 | value -2 | value -3| ... | value - 24
1       10       0          0           0               0
2       11       10         0           0               0
3       12       11         10          0               0
4       13       12         11          10              0
...
24      32       31         30          29              0
1       33       32         31          30              10
2       34       33         32          31              11
and so on...

所有值都是示例。正如我所说,有很多行,不仅是一天中所有小时的24行,而是所有后续时间序列从1到24等等。 在此先感谢,也许力量与你同在!

2 个答案:

答案 0 :(得分:3)

这是你需要的吗?

df = pd.DataFrame([[1,10],[2,11],
             [3,12],[4,13]], columns=['hour','value'])

for i in range(1, 24):
    df['value -' + str(i)] = df['value'].shift(i).fillna(0)

结果:

enter image description here

答案 1 :(得分:0)

这是你在找什么?

import pandas as pd
df = pd.DataFrame({'hour': list(range(24))*2, 
                   'value': list(range(48))})

shift_cols_n = 10 
for shift in range(1, shift_cols_n): 
    new_columns_name = 'value - ' + str(shift)

    # Assuming that you don't have any NAs in your dataframe
    df[new_columns_name] = df['value'].shift(shift).fillna(0)

    # A safer (and a less simple) way, in case you have NAs in your dataframe
    df[new_columns_name] = df['value'].shift(shift)
    df.loc[:shift, new_columns_name] = 0

print(df.head(9))

   hour  value  value - 1  value - 2  value - 3  value - 4  value - 5  \
0     0      0        0.0        0.0        0.0        0.0        0.0   
1     1      1        0.0        0.0        0.0        0.0        0.0   
2     2      2        1.0        0.0        0.0        0.0        0.0   
3     3      3        2.0        1.0        0.0        0.0        0.0   
4     4      4        3.0        2.0        1.0        0.0        0.0   
5     5      5        4.0        3.0        2.0        1.0        0.0   
6     6      6        5.0        4.0        3.0        2.0        1.0   
7     7      7        6.0        5.0        4.0        3.0        2.0   
8     8      8        7.0        6.0        5.0        4.0        3.0   

   value - 6  value - 7  value - 8  value - 9  
0        0.0        0.0        0.0        0.0  
1        0.0        0.0        0.0        0.0  
2        0.0        0.0        0.0        0.0  
3        0.0        0.0        0.0        0.0  
4        0.0        0.0        0.0        0.0  
5        0.0        0.0        0.0        0.0  
6        0.0        0.0        0.0        0.0  
7        1.0        0.0        0.0        0.0  
8        2.0        1.0        0.0        0.0