У меня есть два dataframe df_x и df_y, и я хочу объединить эти два (df_x имеет 1000 строк) с Merge (как = 'inner'), все в порядке, когда у df_y есть 1000 строк, но он очень медленный с большим dataframe (Ожидается: 40_000_000 рядов). < /p>
Я хотел бы ускорить расчеты. Я попытался использовать df1.join (df2) и сортировать их до Merge , но с плохими результатами. Есть идеи для улучшения кода? < /p>
import pandas as pd
import numpy as np
import time
match_columns = ['a', 'b', 'c', 'd', 'e']
extra_columns_X = ['X' + str(i) for i in range(9)]
extra_columns_Y = ['Y' + str(i) for i in range(9)]
# Define function to generate synthetic dataframes
def generate_synthetic_data():
# Generate df1 with coarse resolution
n_rows = 1000 # Desired number of rows
df_X = pd.DataFrame({
match_columns[0]: np.linspace(0, 10000, n_rows), # Finer steps
match_columns[1]: np.linspace(0, 5000, n_rows),
match_columns[2]: np.linspace(10, 11000, n_rows),
match_columns[3]: np.linspace(20, 12000, n_rows),
match_columns[4]: np.linspace(30, 13000, n_rows),
})
# Add some extra columns to df1
for col in extra_columns_X:
df_X[col] = np.random.uniform(0, 1, len(df_X)) # Random values
df_X = df_X.astype('float32')
df_X = np.around(df_X, 2)
# Generate df2 with finer resolution for match columns
n_rows = 40000000 # Desired number of rows
df_Y = pd.DataFrame({
match_columns[0]: np.linspace(0, 10000, n_rows), # Finer steps
match_columns[1]: np.linspace(0, 5000, n_rows),
match_columns[2]: np.linspace(10, 11000, n_rows),
match_columns[3]: np.linspace(20, 12000, n_rows),
match_columns[4]: np.linspace(30, 13000, n_rows),
})
# This enforce common values in match_columns
interval = n_rows // len(df_X)
for i, col in enumerate(match_columns):
df_Y.iloc[::interval, i] = df_X[col].values # Assign df_X values at regular intervals
# Add some extra columns to df2
for col in extra_columns_Y:
df_Y[col] = np.random.uniform(0, 1, len(df_Y)) # Random values
df_Y = df_Y.astype('float32')
df_Y = np.around(df_Y, 2)
return df_X, df_Y
# Generate the dataframes
df_X, df_Y = generate_synthetic_data()
# Timing for pd.merge
start_time = time.time()
merged_with_merge = pd.merge(df_X, df_Y, on=match_columns, how='inner')
print("Merge Time:", time.time() - start_time)
# # Timing for pd.merge
# start_time = time.time()
# df_X.sort_values(match_columns, inplace=True)
# df_Y.sort_values(match_columns, inplace=True)
# merged_with_merge = pd.merge(df_X, df_Y, on=match_columns, how='inner')
# print("Merge Time if sorted:", time.time() - start_time)
# Timing with dask
import dask.dataframe as dd
start_time = time.time()
ddf_X = dd.from_pandas(df_X, npartitions=10)
ddf_Y = dd.from_pandas(df_Y, npartitions=10)
merged_with_dask = dd.merge(ddf_X, ddf_Y, on=match_columns, how='inner').compute()
print("Merge Time with dask:", time.time() - start_time)
# Timing for set_index + join
start_time = time.time()
df_X.sort_values(match_columns, inplace=True)
df_Y.sort_values(match_columns, inplace=True)
df_X_indexed = df_X.set_index(match_columns)
df_Y_indexed = df_Y.set_index(match_columns)
merged_with_join = df_X_indexed.join(df_Y_indexed, how='inner').reset_index()
print("Join Time if sorted:", time.time() - start_time)
# Results
print("Rows Merged with Merge:", len(merged_with_merge))
print("Rows Merged with Join:", len(merged_with_join))
Подробнее здесь: https://stackoverflow.com/questions/793 ... -dataframe
Улучшите производительность слияния панд с помощью одного большого фрейма данных. ⇐ Python
Программы на Python
1737758194
Anonymous
У меня есть два dataframe df_x и df_y, и я хочу объединить эти два (df_x имеет 1000 строк) с Merge (как = 'inner'), все в порядке, когда у df_y есть 1000 строк, но он очень медленный с большим dataframe (Ожидается: 40_000_000 рядов). < /p>
Я хотел бы ускорить расчеты. Я попытался использовать df1.join (df2) и сортировать их до Merge , но с плохими результатами. Есть идеи для улучшения кода? < /p>
import pandas as pd
import numpy as np
import time
match_columns = ['a', 'b', 'c', 'd', 'e']
extra_columns_X = ['X' + str(i) for i in range(9)]
extra_columns_Y = ['Y' + str(i) for i in range(9)]
# Define function to generate synthetic dataframes
def generate_synthetic_data():
# Generate df1 with coarse resolution
n_rows = 1000 # Desired number of rows
df_X = pd.DataFrame({
match_columns[0]: np.linspace(0, 10000, n_rows), # Finer steps
match_columns[1]: np.linspace(0, 5000, n_rows),
match_columns[2]: np.linspace(10, 11000, n_rows),
match_columns[3]: np.linspace(20, 12000, n_rows),
match_columns[4]: np.linspace(30, 13000, n_rows),
})
# Add some extra columns to df1
for col in extra_columns_X:
df_X[col] = np.random.uniform(0, 1, len(df_X)) # Random values
df_X = df_X.astype('float32')
df_X = np.around(df_X, 2)
# Generate df2 with finer resolution for match columns
n_rows = 40000000 # Desired number of rows
df_Y = pd.DataFrame({
match_columns[0]: np.linspace(0, 10000, n_rows), # Finer steps
match_columns[1]: np.linspace(0, 5000, n_rows),
match_columns[2]: np.linspace(10, 11000, n_rows),
match_columns[3]: np.linspace(20, 12000, n_rows),
match_columns[4]: np.linspace(30, 13000, n_rows),
})
# This enforce common values in match_columns
interval = n_rows // len(df_X)
for i, col in enumerate(match_columns):
df_Y.iloc[::interval, i] = df_X[col].values # Assign df_X values at regular intervals
# Add some extra columns to df2
for col in extra_columns_Y:
df_Y[col] = np.random.uniform(0, 1, len(df_Y)) # Random values
df_Y = df_Y.astype('float32')
df_Y = np.around(df_Y, 2)
return df_X, df_Y
# Generate the dataframes
df_X, df_Y = generate_synthetic_data()
# Timing for pd.merge
start_time = time.time()
merged_with_merge = pd.merge(df_X, df_Y, on=match_columns, how='inner')
print("Merge Time:", time.time() - start_time)
# # Timing for pd.merge
# start_time = time.time()
# df_X.sort_values(match_columns, inplace=True)
# df_Y.sort_values(match_columns, inplace=True)
# merged_with_merge = pd.merge(df_X, df_Y, on=match_columns, how='inner')
# print("Merge Time if sorted:", time.time() - start_time)
# Timing with dask
import dask.dataframe as dd
start_time = time.time()
ddf_X = dd.from_pandas(df_X, npartitions=10)
ddf_Y = dd.from_pandas(df_Y, npartitions=10)
merged_with_dask = dd.merge(ddf_X, ddf_Y, on=match_columns, how='inner').compute()
print("Merge Time with dask:", time.time() - start_time)
# Timing for set_index + join
start_time = time.time()
df_X.sort_values(match_columns, inplace=True)
df_Y.sort_values(match_columns, inplace=True)
df_X_indexed = df_X.set_index(match_columns)
df_Y_indexed = df_Y.set_index(match_columns)
merged_with_join = df_X_indexed.join(df_Y_indexed, how='inner').reset_index()
print("Join Time if sorted:", time.time() - start_time)
# Results
print("Rows Merged with Merge:", len(merged_with_merge))
print("Rows Merged with Join:", len(merged_with_join))
Подробнее здесь: [url]https://stackoverflow.com/questions/79378096/improve-pandas-merge-performance-with-one-large-dataframe[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия