Есть ли способ выполнить создание реляционных панелей данных? - PullRequest
1 голос
/ 01 мая 2019

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

У меня есть несколько фреймов данных:

plot_d1_sw1 - это чтение из .csv

            timestamp  switchID    deviceID  count
0 2019-05-01 07:00:00         1  GTEC122277      1
1 2019-05-01 08:00:00         1  GTEC122277      1
3 2019-05-01 10:00:00         1  GTEC122277      3

d1_sw1 - это последние 12 часов и условное условие появления данных в filt

             timestamp    num
0  2019-05-01 12:00:00  False
1  2019-05-01 11:00:00  False
2  2019-05-01 10:00:00   True
3  2019-05-01 09:00:00  False
4  2019-05-01 08:00:00   True
5  2019-05-01 07:00:00   True
6  2019-05-01 06:00:00  False
7  2019-05-01 05:00:00  False
8  2019-05-01 04:00:00  False
9  2019-05-01 03:00:00  False
10 2019-05-01 02:00:00  False
11 2019-05-01 01:00:00  False

Я пытался замаскировать это и перетаскивать столбец count в любые значения True, используя следующее:

mask_d1_sw1 = d1_sw1.num == False
d1_sw1.loc[mask_d1_sw1, column_name] = 0

i=0
for row in plot_d1_sw1.itertuples():
    mask_d1_sw1 = d1_sw1.num == True
    d1_sw1.loc[mask_d1_sw1, column_name] = plot_d1_sw1['count'].values[i]
    print(d1_sw1)
    i = i + 1

это дает мне:

             timestamp  num
0  2019-05-01 12:00:00    0
1  2019-05-01 11:00:00    0
2  2019-05-01 10:00:00    3
3  2019-05-01 09:00:00    0
4  2019-05-01 08:00:00    3
5  2019-05-01 07:00:00    3
6  2019-05-01 06:00:00    0
7  2019-05-01 05:00:00    0
8  2019-05-01 04:00:00    0
9  2019-05-01 03:00:00    0
10 2019-05-01 02:00:00    0
11 2019-05-01 01:00:00    0

... Я знаю, что это потому, что я перебираю столбец count в plot_d1_sw1, но я не могу на всю жизнь понять, как логически заполнить это, чтобы получить результат:

             timestamp  num
0  2019-05-01 12:00:00    0
1  2019-05-01 11:00:00    0
2  2019-05-01 10:00:00    3
3  2019-05-01 09:00:00    0
4  2019-05-01 08:00:00    1
5  2019-05-01 07:00:00    1
6  2019-05-01 06:00:00    0
7  2019-05-01 05:00:00    0
8  2019-05-01 04:00:00    0
9  2019-05-01 03:00:00    0
10 2019-05-01 02:00:00    0
11 2019-05-01 01:00:00    0

Как мне достичь этого результата?

1 Ответ

0 голосов
/ 01 мая 2019

Один из способов - merge на отметке времени, а затем умножить логические значения на count:

df = d1_sw1.merge(plot_d1_sw1, how='left', on='timestamp')
df['num'] = df.num.mul(df['count'].fillna(0)).astype(int)
df[['timestamp', 'num']]

Что дает:

         timestamp        num
0   2019-05-01-12:00:00    0
1   2019-05-01-11:00:00    0
2   2019-05-01-10:00:00    3
3   2019-05-01-09:00:00    0
4   2019-05-01-08:00:00    1
5   2019-05-01-07:00:00    1
6   2019-05-01-06:00:00    0
7   2019-05-01-05:00:00    0
8   2019-05-01-04:00:00    0
9   2019-05-01-03:00:00    0
10  2019-05-01-02:00:00    0
11  2019-05-01-01:00:00    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...