2017-07-07 77 views
1

解释有点复杂,所以我会尽我所能。我有一个有两列的熊猫:小时(从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等等。 在此先感谢您,并且愿意与你们同在!

+0

请问为什么要这样做?您引入了大量冗余数据,因此可能有更好的方法。 – Denziloe

+0

最好不要将逻辑写入数据库,而是写入独立的函数。你可能应该重新考虑它。 – baloo

回答

2

这是你需要的吗?

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

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 
相关问题