423244行の大きなデータフレームがあります。これを4つに分割したいのですが、エラーが発生した次のコードを試しましたか?ValueError: array split does not result in an equal division
for item in np.split(df, 4):
print item
このデータフレームを4つのグループに分割するにはどうすればよいですか?
423244行の大きなデータフレームがあります。これを4つに分割したいのですが、エラーが発生した次のコードを試しましたか?ValueError: array split does not result in an equal division
for item in np.split(df, 4):
print item
このデータフレームを4つのグループに分割するにはどうすればよいですか?
回答:
使用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リストを返すので、リストをループするだけです...
AttributeError: 'DataFrame' object has no attribute 'size'
同じことをしたかったのですが、最初に分割機能に問題があり、次にパンダ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
ことに注意してnp.array_split(df, 3)いる間、3つのサブデータフレームにデータフレームを分割split_dataframe機能は、で定義された@エリクシルの答えと呼ばれる、split_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_splitnumpy-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)]
注:groupby2番目の要素がデータフレームであるタプルを返すため、抽出は少し複雑になります。
>>> len(subframes), [len(i) for i in subframes]
(4, [25, 25, 25, 24])
また、np.array_splitがPandas DataFrameで機能しないことも経験しました。私の解決策は、DataFrameのインデックスのみを分割してから、「group」ラベルの付いた新しい列を導入することでした。
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()
リスト内包表記を使用して、これを1行で行うことができます
n = 4
chunks = [df[i:i+n] for i in range(0,df.shape[0],n)]
np.split(df, N)機能をしてください。