Используйте pandas dataframe apply для замены значений строк из массива numpy

#python #pandas #dataframe #numpy #dask

Вопрос:

У меня есть фрейм данных pandas с уникальными значениями int от 0 до 4.

 df.head()
            Labels
Date
2020-01-02       0
2020-01-03       0
2020-01-06       1
2020-01-07       2
2020-01-08       2
 

У меня есть массив numpy

 np_arr
array([[12., 17., 10.,  3.],
       [10., 23.,  9.,  6.],
       [16.,  9.,  5.,  9.],
       [17., 22., 14.,  9.],
       [19., 14., 10.,  8.]])
 

У меня есть еще один пустой фрейм данных с той же формой, что и у df.

 df_final.head()
           col_0  col_1  col_2  col_3  
Date
2020-01-02    0.0    0.0    0.0    0.0 
2020-01-03    0.0    0.0    0.0    0.0 
2020-01-06    0.0    0.0    0.0    0.0 
2020-01-07    0.0    0.0    0.0    0.0 
2020-01-08    0.0    0.0    0.0    0.0 
 

Я хотел бы использовать apply в df_final для замены значений строк из np_arr на основе значения метки в dataframe df.

Для бывших:

 if df.values[0]=x:
    df_final.values[0]=np_arr[x]

 

Спасибо вам за вашу помощь.

Ответ №1:

Приведенный ниже код должен отлично справляться с этой задачей, а также гораздо более эффективен, чем работа по строкам.

 df_final = pd.DataFrame(np_arr[df.Labels].reshape(df_final.shape[0], df_final.shape[1]), index=df_final.index, columns=df_final.columns)
 

Ответ №2:

Вот еще один подход. Вы также добавили dask тег, поэтому код в конце показывает, как его использовать dask .

 import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(5, size=(10,1)), columns=['Labels'])
np_arr = np.random.randint(1, 10, size=(5,4))
np_arr_to_df = pd.DataFrame(np_arr, columns=[f'col_{x}' for x in range(4)])

df_final = pd.merge(df, np_arr_to_df, how='left', left_on=['Labels'], right_index=True)
print(df_final)

#    Labels  col_0  col_1  col_2  col_3
# 0       0      6      2      5      1
# 1       4      8      8      3      2
# 2       2      8      5      5      1
# 3       1      2      3      1      3
# 4       0      6      2      5      1
# 5       4      8      8      3      2
# 6       1      2      3      1      3
# 7       0      6      2      5      1
# 8       4      8      8      3      2
# 9       0      6      2      5      1


import dask.dataframe as dd

ddf = dd.from_pandas(df, npartitions=2)
ddf_final = dd.merge(ddf, np_arr_to_df, how='left', left_on='Labels', right_index=True)

# if ddf_final is large, you do not want to use .compute() until necessary
print(ddf_final.compute())

#    Labels  col_0  col_1  col_2  col_3
# 0       0      6      2      5      1
# 1       4      8      8      3      2
# 2       2      8      5      5      1
# 3       1      2      3      1      3
# 4       0      6      2      5      1
# 5       4      8      8      3      2
# 6       1      2      3      1      3
# 7       0      6      2      5      1
# 8       4      8      8      3      2
# 9       0      6      2      5      1