2017-11-21 9 views
0

大きなファイルがあり、Pandasの単一のデータフレームにインポートされています。 私は、ファイルを複数のセグメントに分割するために、データフレームの行数でpandasを使用しています。pandas:複数のcsvにデータフレームを分割

例:10行:1が取得する ファイル[0:4] [:9 5]

は、より多くのデータフレームを作成することなく、これを行う方法はあり ファイル2を取得しますか?

+0

必要なものを得るためにdf[df.g==1]を呼び出すことができますか? – Wen

+0

キャッチのためにありがとう。私はその詳細 – billyc59

+1

'df.iloc [0:4、:]。to_csv(path)'でその質問を更新し、それを繰り返して... – DJK

答えて

0

これには2通りの方法があります。私はあなたが元を探していると信じています。基本的には、一連のcsvライターを開いてから、インデックスを使って基本的な数式を使って正しいcsvライターに書き込んだ後、すべてのファイルを閉じます。

単一DATAFRAME

は均等にCSVファイル

import pandas as pd 
import csv, math 

df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10]) # uncreative input values for 10 columns 
NUMBER_OF_SPLITS = 2 
fileOpens = [open(f"out{i}.csv","w") for i in range(NUMBER_OF_SPLITS)] 
fileWriters = [csv.writer(v, lineterminator='\n') for v in fileOpens] 
for i,row in df.iterrows(): 
    fileWriters[math.floor((i/df.shape[0])*NUMBER_OF_SPLITS)].writerow(row.tolist()) 
for file in fileOpens: 
    file.close() 

つ以上のデータフレームを均等に

import pandas as pd 
import numpy as np 

df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10]) # uncreative input values for 10 columns 
NUMBER_OF_SPLITS = 2 
for i, new_df in enumerate(np.array_split(df,NUMBER_OF_SPLITS)): 
    with open(f"out{i}.csv","w") as fo: 
      fo.write(new_df.to_csv()) 
+0

このソリューションは、新しいdfの作成を強制します。 – billyc59

+0

@ billyc59更新されました。 – Neil

0

反復トリックを行いますILOCの引数以上のCSVファイルのN個に分割のN個に分割します。

1

assignここで新しい列gを指定すると、それぞれのグループにいくつのアイテムが必要かを具体的に指定するだけで、ここでは3を使用しています。

df.assign(g=df.index//3) 
Out[324]: 
    0 g 
0 1 0 
1 2 0 
2 3 0 
3 4 1 
4 5 1 
5 6 1 
6 7 2 
7 8 2 
8 9 2 
9 10 3 

と、あなたは、ルールの種類によって分割

+1

本当に新しい列が必要ですか? 'df [np.arange(len(df))// 3 == 1]' – MaxU

+0

@MaxUそうですね:-) – Wen

関連する問題