Сплит Dataframe по размеру, Python 3.6 - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу разделить фрейм данных на 30 МБ другого набора данных. Затем мне нужно экспортировать в CSV-файл.

FileSize = SQLData.memory_usage(index=True, deep=False).sum())
FileSizeMB = FileSize/1038336
if FileSizeMB > 30:
  # Want to split data frame below 30MB.
  # Export splitted Dataframe
else:
    SQLData.to_csv(r'D:\Export\SQLData.csv', sep=',', index=False, na_rep='NA')

Возможно ли это?

1 Ответ

0 голосов
/ 14 ноября 2018

Попробуйте следующее рекурсивное решение:

# solution
def save_file_part(df, size_threshold, save_path, part_number=0):
    file_size = df.memory_usage(index=True, deep=False).sum() / 1038336
    num_records = len(df)

    if file_size > size_threshold:
        records_to_split_off = int(num_records * size_threshold // file_size)
        df_to_save = df.head(records_to_split_off)
        df_to_save.to_csv(save_path.format(part_number),sep=',', index=False, na_rep='NA')
        save_file_part(df.tail(num_records-records_to_split_off), size_threshold, save_path, part_number=part_number+1)

    else:
        df.to_csv(save_path.format(part_number), sep=',', index=False, na_rep='NA')


# example
dates = pd.date_range('20130101',periods=60000)
df = pd.DataFrame(np.random.randn(60000,4),index=dates,columns=list('ABCD'))
file_size = df.memory_usage(index=True, deep=False).sum() / 1038336
print(file_size)

save_file_part(df, 0.5, save_path="c:/tmp/my_df_{}.csv") # note, the function expects "save_path" as a string with at least one "{}" placeholder

df.memory_usage сообщает вам, насколько большой пандан DataFrame находится в памяти. При сохранении CSV размер будет отличаться (будет больше), поэтому вы можете установить size_threshold на 15 Мб. Вы можете определить подходящий размер с помощью скрипта, но вы можете просто немного поэкспериментировать, чтобы найти правильный рацион

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