Панды - Создание бинарных данных из существующих данных - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь создать двоичные данные из существующего фрейма данных, но для его завершения требуется очень много времени. Есть ли более быстрый способ сделать это?

Теперь у меня есть фрейм данных с несколькими строками, скажем, df, например .:

Index   Actions Tries   Ratio
0       20      200     0,1
1       10      400     0,025
2       15      500     0,03
3       30      700     0,04

Теперь я хочу преобразовать эти данные в двоичные данные, скажем, df_binary, например.

Index_old   Index_new   Actions Tries   Ratio   Success
0           0           20      200     0,1     1
0           1           20      200     0,1     1
0           2           20      200     0,1     1
0           3           20      200     0,1     1
...     
0           19          20      200     0,1     1  -> 20 times success(1)   
0           20          20      200     0,1     0
0           21          20      200     0,1     0
0           22          20      200     0,1     0
...                 
0           199         20      200     0,1     0  -> 200-20= 180 times fail(0)
1           200         10      400     0,025   1
1           201         10      400     0,025   1
1           202         10      400     0,025   1

Как видно из приведенного выше примера, Actions / Tries = Ratio. Количество раз, которое должно быть воспроизведено, основано на попытках, количество раз, когда succes = 1, основано на действиях. Количество успешных попыток = 0 основано на попытках - действиях.

import pandas as pd
#create the new DataFrame
df_binary = pd.DataFrame()
#iterate over all rows in the original DataFrame (df)
for index,row in df.iterrows():
    #get the number of tries from the row in the df
    tries = row['Tries']
    #get the number of actions from the row in the df
    actions = row['Actions']
    #calculate the number of times the tries did not result in action
    noActions = tries - actions
    #create a temporary df used for appending
    tempDf = row

    #loop for the range given by tries (row['Tries']) e.g. loop 200 times      
    for try in range(tries):  
        if try < actions:
            #if the number of actions is lower than tries, set success to 1. E.g. try 1 < 20, set success, try 15 < 20, set success
            tempDf['Success'] = 1
            #append new data to df_binary
            df_binary = df_binary.append(tempDf, ignore_index=True)
        else:
            #else set success to failure, e.g. try 25 > 20 set failure, try 180 > 20 set failure.
            tempDf['Success'] = 0
            #append new data to df_binary
            df_binary = df_binary.append(tempDf, ignore_index=True)

В этом примере время для завершения не будет таким длинным. Но мой фактический новый df_binary должен содержать около 15 миллионов строк после завершения и содержать еще много столбцов, что занимает очень много времени.

Есть ли способ сделать это быстрее?

Спасибо!

1 Ответ

0 голосов
/ 04 сентября 2018

Вот один из возможных способов достижения этого, используя pandas.concat, Series.repeat и DataFrame.assign в понимании списка:

successes = np.concatenate([[1]*a + [0]*(t-a) for a, t in zip(df['Actions'], df['Tries'])])

df_binary = (pd.concat([df[s].repeat(df['Tries']) for s in df], axis=1)
             .assign(success=successes).reset_index())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...