pandasが初めてなので、我慢してください...
私は多くの行を持つ多くのテーブルを持つ巨大なcsvを持っています。 10行を超える場合、各データフレームを単純に2つに分割します。
Trueの場合、最初のデータフレームに最初の10個、残りを2番目のデータフレームに含めるようにします。
これに便利な機能はありますか?私は周りを見ましたが、有用なものは何も見つかりませんでした...
すなわちsplit_dataframe(df、2(if> 10))?
これは、条件が満たされた場合、分割されたDataFramesを返します。それ以外の場合は、元のNone
(個別に処理する必要がある)を返します。これは、分割がdf
ごとに1回だけ行う必要があり、分割の2番目の部分(10行より長い場合(元の行が20行より長いことを意味する)は問題ないことを前提としています).
_df_new1, df_new2 = df[:10, :], df[10:, :] if len(df) > 10 else df, None
_
df.head(10)
とdf.tail(len(df) - 10)
を使用して、必要に応じて前面と背面を取得することもできます。必要に応じて、_df[:10]
_の代わりに_df[:10, :]
_のように、最初のディメンションインデックスを提供することもできます(ただし、使用するディメンションについて明示的にコーディングしたいのですが)。 _df.iloc
_と_df.ix
_を使用して、同様の方法でインデックスを作成することもできます。
ただし、 ラベルベースであり、入力が整数位置として解釈されることはありません なので、_df.loc
_の使用には注意してください。 _.loc
_は、偶然0から始まる整数のインデックスラベルがギャップなしである場合にのみ「偶然」機能します。
ただし、pandasはDataFrameのコンテンツをHTMLにダンプするためのさまざまなオプションを検討する必要があります。LaTeXを使用すると、プレゼンテーション用のより適切に設計されたテーブルを作成できます(コピーと貼り付けの代わりに)。 DataFrameをこれらの形式に変換する方法を単純にグーグルで検索すると、まさにこのアプリケーションに関する多くのチュートリアルとアドバイスが見つかります。
特定の便利な機能はありません。
次のようなことをする必要があります。
first_ten = pd.DataFrame()
rest = pd.DataFrame()
if df.shape[0] > 10: # len(df) > 10 would also work
first_ten = df[:10]
rest = df[10:]
List Comprehension を使用して、巨大なDataFrameを100'000のブロックにカットしました。
size = 100000
list_of_dfs = [df.loc[i:i+size-1,:] for i in range(0, len(df),size)]
またはジェネレーターとして:
list_of_dfs = (df.loc[i:i+size-1,:] for i in range(0, len(df),size))
_np.split
_に基づくメソッド:
_df = pd.DataFrame({ 'A':[2,4,6,8,10,2,4,6,8,10],
'B':[10,-10,0,20,-10,10,-10,0,20,-10],
'C':[4,12,8,0,0,4,12,8,0,0],
'D':[9,10,0,1,3,np.nan,np.nan,np.nan,np.nan,np.nan]})
listOfDfs = [df.loc[idx] for idx in np.split(df.index,5)]
_
モジュロを使用する小さな関数は、分割が均等でない場合に対処できます(たとえば、np.split(df.index,4)
はエラーをスローします)。
(はい、元の質問はこれよりも多少具体的だったことを認識しています。ただし、これはタイトルの質問に答えることになっています。)
以下は、DataFrameをチャンクといくつかのコード例に分割する単純な関数の実装です。
import pandas as pd
def split_dataframe_to_chunks(df, n):
df_len = len(df)
count = 0
dfs = []
while True:
if count > df_len-1:
break
start = count
count += n
#print("%s : %s" % (start, count))
dfs.append(df.iloc[start : count])
return dfs
# Create a DataFrame with 10 rows
df = pd.DataFrame([i for i in range(10)])
# Split the DataFrame to chunks of maximum size 2
split_df_to_chunks_of_2 = split_dataframe_to_chunks(df, 2)
print([len(i) for i in split_df_to_chunks_of_2])
# prints: [2, 2, 2, 2, 2]
# Split the DataFrame to chunks of maximum size 3
split_df_to_chunks_of_3 = split_dataframe_to_chunks(df, 3)
print([len(i) for i in split_df_to_chunks_of_3])
# prints [3, 3, 3, 1]
ここでは、スライス/場所の代わりに、DataFrameのheadメソッドとtailメソッドを構文糖として使用できます。分割サイズ3を使用します。例では、headSize = 10を使用します
def split(df, headSize) :
hd = df.head(headSize)
tl = df.tail(len(df)-headSize)
return hd, tl
df = pd.DataFrame({ 'A':[2,4,6,8,10,2,4,6,8,10],
'B':[10,-10,0,20,-10,10,-10,0,20,-10],
'C':[4,12,8,0,0,4,12,8,0,0],
'D':[9,10,0,1,3,np.nan,np.nan,np.nan,np.nan,np.nan]})
# Split dataframe into top 3 rows (first) and the rest (second)
first, second = split(df, 3)
大きなデータフレームがあり、たとえば各サブデータフレームに最大4500行があるように、可変数のサブデータフレーム行に分割する必要がある場合、このスクリプトは次のような場合に役立ちます。
max_rows = 4500
dataframes = []
while len(df) > max_rows:
top = df[:max_rows]
dataframes.append(top)
df = df[max_rows:]
else:
dataframes.append(df)
次に、これらのデータフレームを保存できます。
for _, frame in enumerate(dataframes):
frame.to_csv(str(_)+'.csv', index=False)
これが誰かを助けることを願っています!
リスト内包表記とgroupby
に基づくメソッド。すべての分割データフレームをリスト変数に格納し、インデックスを使用してアクセスできます。
例:
ans = [pd.DataFrame(y) for x, y in DF.groupby('column_name', as_index=False)]***
ans[0]
ans[0].column_name