Как создать массив / фрейм данных, заполненный 1 или 0, основываясь на том, находится ли время в пределах диапазона? - PullRequest
0 голосов
/ 31 мая 2018

По сути, у меня есть фрейм данных , который имеет 2 столбца, каждый из которых является часами:

    0    1
 +-----+----+    
0|  11 | 12 |
 +-----+----+
1|   3 | 4  |
 +-----+----+
2|  11 | 12 |
 +-----+----+
3|   6 |  7 |
 +-----+----+
4|  16 | 16 |

     etc...

Это несколько тысяч строк.Я хочу создать другой фрейм данных с заголовками столбцов от 1 до 24 (на основе часов 24-часового периода), и для каждой строки указанного выше фрейма данных отображается 1, если время в часах находится в этом диапазоне (включительно), и0, если он находится за пределами.

Так, например, вторая строка указанного выше кадра данных будет выглядеть примерно так:

1   2   3   4   5   6   7   8 ......24
0   0   1   1   0   0   0   0 ......0

И я хочу сделать то же самое для каждой строки первого кадра данныхи добавьте новый 24-часовой фрейм данных.

Надеюсь, это имеет смысл, и кто-то может помочь!Рад идти дальше, если это не имеет смысла!Также я новичок в публикации здесь, так что точно не знаю, как заставить данные вставлять разумным способом.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Вы можете сравнивать и умножать значения, создавая фрейм данных, т.е.

temp = pd.DataFrame([np.arange(1,25)],index = df.index,)

begin = (temp.values>=df['0'].values[:,None]).astype(int)
end = (temp.values<=df['1'].values[:,None]).astype(int)


pd.DataFrame(begin*end,columns=np.arange(1,25))

    1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24
0   0   0   0   0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0
1   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
2   0   0   0   0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0
3   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
4   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0
0 голосов
/ 31 мая 2018

Это еще одно возможное решение:

import pandas as pd
df=pd.DataFrame([[11, 12],[3,   4],[11,  12],[6,  7],[16,  16]], columns=[0,1])
print("df= \n ",df)

dg=pd.DataFrame(columns=np.arange(1,26))
for i in df.index:
    for j in [0,1]:
        dg.loc[i,df.iloc[i,j]]=1
print("dg= \n", dg.fillna(0))

df= 
      0   1
0  11  12
1   3   4
2  11  12
3   6   7
4  16  16
dg= 
    1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25
0   0   0   0   0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0
1   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
2   0   0   0   0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0
3   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
4   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0
0 голосов
/ 31 мая 2018

Использование:

df = (pd.DataFrame([dict.fromkeys(range(a, b + 1), 1) for a, b in zip(df[0], df[1])])
        .reindex(columns=range(1, 25), fill_value=0)
        .fillna(0)
        .astype(int))

print (df)
   1   2   3   4   5   6   7   8   9  ...  16  17  18  19  20  21  22  23  24
0   0   0   0   0   0   0   0   0   0 ...   0   0   0   0   0   0   0   0   0
1   0   0   1   1   0   0   0   0   0 ...   0   0   0   0   0   0   0   0   0
2   0   0   0   0   0   0   0   0   0 ...   0   0   0   0   0   0   0   0   0
3   0   0   0   0   0   1   1   0   0 ...   0   0   0   0   0   0   0   0   0
4   0   0   0   0   0   0   0   0   0 ...   1   0   0   0   0   0   0   0   0

[5 rows x 24 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...