Самый быстрый способ преобразования данных - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть фрейм данных с 3 столбцами:

reading_df:

    c1  c2  c3
    1   1   0.104986
    1   1   0.628024
    0   0   0.507727
    1   1   0.445931
    0   1   0.867830
    1   1   0.455478
    1   0   0.271283
    0   1   0.759124
    1   0   0.382079
    0   1   0.572290

Для каждого элемента в 3 столбце (c3) я должен найти, сколько элементов (строк):

  • имеют одинаковые значения для c1
  • имеют одинаковые значения для c2
  • различия между значениями в c3 в данной строке и каждой строке должны быть меньше, чем 0,3

Например, запись ответа в столбце c4

   c1  c2  c3        c4
    1   1   0.104986  0
    1   1   0.628024  2
    0   0   0.507727  0
    1   1   0.445931  0
    0   1   0.867830  2
    1   1   0.455478  1
    1   0   0.271283  0
    0   1   0.759124  1
    1   0   0.382079  1
    0   1   0.572290  0

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

reading_df['c4']=np.zeros(df.shape[0])

X=np.array(reading_df)

c1=0
c2=1
c3=2
dT=0.3

res_map =  map(lambda el: len( X[

    ( X[:,n_time] > (el[n_time]-dT) ) 

    & ( X[:,n_time] < (el[n_time])  )

    & ( X[:,n_feature2] == (el[n_feature2]) )

    & ( X[:,n_feature1] == (el[n_feature1]) )

                                    ][:,n_time]), X)

Но когда япопытаться преобразовать объект карты res_map в список:

result=list(res_map)
result_dataframe=pd.DataFrame({'c4':result })

мой код стал очень медленным.И очень долго работайте с большим фреймом данных с более чем 1 * 10 ^ 6 элементов.

Какую функцию я должен использовать?И какие лучшие практики, чтобы заставить Python работать быстрее?

1 Ответ

0 голосов
/ 21 февраля 2019

Не уверен, какая именно логика стоит за вашим вопросом, но я думаю, что вы хотите groupby, а затем рассчитать diff

Если я правильно понимаю вашу проблему, это сравнение many-to-many в каждомгруппа c1 и c2.

Вот начало вашей проблемы, на котором вы можете построить:

# first calculate the difference between rows in c3 column while applying groupby
df['difference'] = df.groupby(['c1', 'c2']).c3.diff()

# then add a count column which counts the size of each group
df['count'] = df.groupby(['c1', 'c2']).c1.transform('count')

# after that create a conditional field based on the values in the other columns
df['c4'] = np.where((df.c1 == df.c2) & (df.difference < 0.3), 1, 0)

Надеюсь, что это поможет с точки зрения скорости (векторизация) и ближе к решению вашей проблемы.

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