#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