Функция pandas read_csv
не имеет разреженной опции. У меня есть данные csv с тонны нулей в нем (он очень хорошо сжимается, и удаление любого значения 0
уменьшает его до почти половины исходного размера).
Я попытался загрузить его в плотную матрицу сначала с помощью read_csv
, а затем вызвал to_sparse
, но он занимает много времени и задыхается в текстовых полях, хотя большая часть данных является плавающей точкой. Если я сначала назову pandas.get_dummies(df)
, чтобы преобразовать категориальные столбцы в единицы и нули, тогда вызовите to_sparse(fill_value=0)
, это занимает абсурдное количество времени, намного дольше, чем я ожидал бы в основном числовой таблице, содержащей 12 миллионов записей, в основном ноль. Это происходит, даже если я удаляю нули из исходного файла и вызываю to_sparse()
(так что значение заливки равно NaN). Это также происходит независимо от того, прошел ли я kind='block'
или kind='integer'
.
Помимо создания разреженного массива данных вручную, есть ли хороший, плавный способ загрузки разреженного csv напрямую, не съедая кучу лишней памяти?
Вот некоторый код для создания образца набора данных, который имеет 3 столбца данных с плавающей запятой и один столбец текстовых данных. Примерно 85% значений float равны нулю, а общий размер CSV составляет приблизительно 300 МБ, но вы, вероятно, захотите сделать это больше, чтобы действительно проверить ограничения памяти.
np.random.seed(123)
df=pd.DataFrame( np.random.randn(10000000,3) , columns=list('xyz') )
df[ df < 1.0 ] = 0.0
df['txt'] = np.random.choice( list('abcdefghij'), size=len(df) )
df.to_csv('test.csv',index=False)
И вот простой способ прочитать его, но, надеюсь, есть лучший, более эффективный способ:
sdf = pd.read_csv( 'test.csv', dtype={'txt':'category'} ).to_sparse(fill_value=0.0)
Изменить для добавления (от JohnE):. Если возможно, предоставьте некоторую статистику относительной производительности при чтении больших CSV в вашем ответе, включая информацию о том, как вы измеряли эффективность памяти (особенно, поскольку эффективность памяти сложнее для измерения, чем время часов). В частности, обратите внимание, что лучшим ответом может быть более медленный (часовой пояс), , если он более эффективен с точки зрения памяти.