У меня довольно большой размер данных pandas (1.5gig .csv на диске). Я могу загрузить его в память и запросить его. Я хочу, чтобы создать новый столбец, комбинированное значение двух других столбцов, и я попытался это:Как справиться с изменением больших кадров данных pandas
def combined(row):
row['combined'] = row['col1'].join(str(row['col2']))
return row
df = df.apply(combined, axis=1)
В результате моего процесс питона был убит, предположительно, из-за проблемы с памятью.
Более итеративный решение проблемы, кажется:
df['combined'] = ''
col_pos = list(df.columns).index('combined')
crs_pos = list(df.columns).index('col1')
sub_pos = list(df.columns).index('col2')
for row_pos in range(0, len(df) - 1):
df.iloc[row_pos, col_pos] = df.iloc[row_pos, sub_pos].join(str(df.iloc[row_pos, crs_pos]))
Это, конечно, кажется, очень unpandas. И очень медленно.
В идеале мне бы хотелось что-то вроде apply_chunk()
, которое аналогично применять, но работает только на части фрейма. Я думал, что dask
может быть вариантом для этого, но dask
DataFrames, похоже, имели другие проблемы, когда я их использовал. Это должно быть общей проблемой, хотя, есть ли шаблон проектирования, который я должен использовать для добавления столбцов в большие кадры данных панд?
Прежде всего, 'dask' не поможет в вашем случае, потому что ваша проблема связана с I/O и памятью вместо привязки к процессору, а' dask' основан на модуле «многопроцессорности». –
Dask может использовать потоковые, многопроцессорные или распределенные вычисления. В его случае, хотя он не нуждается ни в одном из них, просто способ разумно обрабатывать потоковые данные с диска. – MRocklin
Что касается использования метода apply? – PlagTag