複数のCSVファイル(列数が異なる)をターゲットディレクトリから単一のPython Pandas DataFrameに読み込んで、データを効率的に検索および抽出したい。
サンプルファイル:
Events
1,0.32,0.20,0.67
2,0.94,0.19,0.14,0.21,0.94
3,0.32,0.20,0.64,0.32
4,0.87,0.13,0.61,0.54,0.25,0.43
5,0.62,0.21,0.77,0.44,0.16
これが私がこれまでに持っているものです:
# get a list of all csv files in target directory
my_dir = "C:\\Data\\"
filelist = []
os.chdir( my_dir )
for files in glob.glob( "*.csv" ) :
filelist.append(files)
# read each csv file into single dataframe and add a filename reference column
# (i.e. file1, file2, file 3) for each file read
df = pd.DataFrame()
columns = range(1,100)
for c, f in enumerate(filelist) :
key = "file%i" % c
frame = pd.read_csv( (my_dir + f), skiprows = 1, index_col=0, names=columns )
frame['key'] = key
df = df.append(frame,ignore_index=True)
(インデックス作成が正しく機能していません)
基本的に、以下のスクリプトはまさに私が望むものです(試してテストしました)が、10個以上のcsvファイルをループする必要があります。
df1 = pd.DataFrame()
df2 = pd.DataFrame()
columns = range(1,100)
df1 = pd.read_csv("C:\\Data\\Currambene_001y09h00m_events.csv",
skiprows = 1, index_col=0, names=columns)
df2 = pd.read_csv("C:\\Data\\Currambene_001y12h00m_events.csv",
skiprows = 1, index_col=0, names=columns)
keys = [('file1'), ('file2')]
df = pd.concat([df1, df2], keys=keys, names=['fileno'])
私は多くの関連リンクを見つけましたが、それでもこれを機能させることができません:
ファイルを追加する軸を決定する必要があります。 Pandasは常に正しいことをしようとします:
効率的に追加する秘訣は、ファイルを横向きに傾けることです。これにより、pandas.concat
が実行する動作に一致する望ましい動作が得られます。これが私のレシピです:
from pandas import *
files = !ls *.csv # IPython magic
d = concat([read_csv(f, index_col=0, header=None, axis=1) for f in files], keys=files)
read_csv
はaxis=1
に置き換えられるため、名前を保持したまま、列軸上で連結されることに注意してください。必要に応じて、結果のDataFrameをd.T
で転置することができます。
編集:
各ソースファイルの列数が異なる場合は、ヘッダーを指定する必要があります。ソースファイルにヘッダーがないことを理解したので、簡単な関数でヘッダーを作成しましょう。
def reader(f):
d = read_csv(f, index_col=0, header=None, axis=1)
d.columns = range(d.shape[1])
return d
df = concat([reader(f) for f in files], keys=files)