У меня большой фрейм данных с 423244 строками. Я хочу разделить это на 4. Я пробовал следующий код, который дал ошибку?ValueError: array split does not result in an equal division
for item in np.split(df, 4):
print item
Как разделить этот фрейм данных на 4 группы?
np.split(df, N)
функция, пожалуйста.Ответы:
Использование
np.array_split
:Docstring: Split an array into multiple sub-arrays. Please refer to the ``split`` documentation. The only difference between these functions is that ``array_split`` allows `indices_or_sections` to be an integer that does *not* equally divide the axis.
In [1]: import pandas as pd In [2]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', ...: 'foo', 'bar', 'foo', 'foo'], ...: 'B' : ['one', 'one', 'two', 'three', ...: 'two', 'two', 'one', 'three'], ...: 'C' : randn(8), 'D' : randn(8)}) In [3]: print df A B C D 0 foo one -0.174067 -0.608579 1 bar one -0.860386 -1.210518 2 foo two 0.614102 1.689837 3 bar three -0.284792 -1.071160 4 foo two 0.843610 0.803712 5 bar two -1.514722 0.870861 6 foo one 0.131529 -0.968151 7 foo three -1.002946 -0.257468 In [4]: import numpy as np In [5]: np.array_split(df, 3) Out[5]: [ A B C D 0 foo one -0.174067 -0.608579 1 bar one -0.860386 -1.210518 2 foo two 0.614102 1.689837, A B C D 3 bar three -0.284792 -1.071160 4 foo two 0.843610 0.803712 5 bar two -1.514722 0.870861, A B C D 6 foo one 0.131529 -0.968151 7 foo three -1.002946 -0.257468]
источник
array_split
возвращает список DataFrames, так что вы можете просто просмотреть список ...AttributeError: 'DataFrame' object has no attribute 'size'
Я хотел сделать то же самое, и у меня сначала были проблемы с функцией разделения, затем проблемы с установкой pandas 0.15.2, поэтому я вернулся к своей старой версии и написал небольшую функцию, которая работает очень хорошо. Надеюсь, это поможет!
# input - df: a Dataframe, chunkSize: the chunk size # output - a list of DataFrame # purpose - splits the DataFrame into smaller chunks def split_dataframe(df, chunk_size = 10000): chunks = list() num_chunks = len(df) // chunk_size + 1 for i in range(num_chunks): chunks.append(df[i*chunk_size:(i+1)*chunk_size]) return chunks
источник
Думаю, теперь мы можем использовать для этого plain
iloc
сrange
.chunk_size = int(df.shape[0] / 4) for start in range(0, df.shape[0], chunk_size): df_subset = df.iloc[start:start + chunk_size] process_data(df_subset) ....
источник
Имейте в
np.array_split(df, 3)
виду, что фрейм данных разбивается на 3 подфрейма данных, аsplit_dataframe
функция, определенная в ответе @ elixir , при вызове assplit_dataframe(df, chunk_size=3)
разделяет фрейм данных по каждойchunk_size
строке.Пример:
С
np.array_split
:df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10,11], columns=['TEST']) df_split = np.array_split(df, 3)
... вы получаете 3 субфрейма данных:
df_split[0] # 1, 2, 3, 4 df_split[1] # 5, 6, 7, 8 df_split[2] # 9, 10, 11
С
split_dataframe
:df_split2 = split_dataframe(df, chunk_size=3)
... вы получаете 4 субфрейма данных:
df_split2[0] # 1, 2, 3 df_split2[1] # 4, 5, 6 df_split2[2] # 7, 8, 9 df_split2[3] # 10, 11
Надеюсь, я прав, и что это полезно.
источник
Осторожно:
np.array_split
не работает с numpy-1.9.0. Проверил: работает с 1.8.1.Ошибка:
источник
Вы можете использовать
groupby
, если у вас есть целочисленный индекс:import math df = pd.DataFrame(dict(sample=np.arange(99))) rows_per_subframe = math.ceil(len(df) / 4.) subframes = [i[1] for i in df.groupby(np.arange(len(df))//rows_per_subframe)]
Примечание:
groupby
возвращает кортеж, в котором 2-й элемент является фреймом данных, поэтому извлечение немного усложняется.>>> len(subframes), [len(i) for i in subframes] (4, [25, 25, 25, 24])
источник
Я также столкнулся с тем, что np.array_split не работал с Pandas DataFrame, мое решение заключалось в том, чтобы разделить только индекс DataFrame, а затем ввести новый столбец с меткой «группа»:
indexes = np.array_split(df.index,N, axis=0) for i,index in enumerate(indexes): df.loc[index,'group'] = i
Это делает операции группировки очень удобными, например, для расчета среднего значения каждой группы:
df.groupby(by='group').mean()
источник
вы можете использовать списки, чтобы сделать это в одной строке
n = 4 chunks = [df[i:i+n] for i in range(0,df.shape[0],n)]
источник