'22/05/01更新:
本記事では、Pythonでデータ処理するために、ほぼ必須のPandasとNumpyとlistについて、その概要説明と雛形コードを載せました。それぞれの特徴を一言で述べると、pandasは行列データの加工が容易、numpyは行列計算が高速、listは1次元配列でループ処理することが主な使用方法です。
下記のような行列データを元に、それぞれのデータの見え方を説明しています。
NAME,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
cabbage,14,3,71,13,21,2,79,30,27,10,367,
carrot,14,4,77,4,23,2,83,26,25,9,370,
corn,14,5,86,10,17,1,99,29,27,8,404,
cucumber,14,4,68,5,45,4,73,28,25,8,360,
eggplant,14,4,85,6,32,9,54,34,31,6,399,
green onion,13,5,69,11,31,6,95,33,31,6,381,
green soybean,13,4,74,6,25,1,79,28,26,6,346,
iceberg lettuce,34,2,28,4,19,1,37,10,10,6,152,
japanese radish,13,7,79,7,13,3,69,33,33,5,343,
pumpkin,19,0,25,0,15,0,25,11,10,5,141,3
tomato,11,2,61,6,19,5,44,28,26,4,278,
■1. pandas
pandasは、csvファイルなどを読み込んでからのデータ分析する前処理として、行列データの加工に便利です。例えば、指定した行や列を削除したり、指定条件の行や列データを抽出したり、行や列同士を計算したりもできます。また、他のファイルのデータを結合なども容易です。その理由は、行列の指定方法が、行番号や、行名、列名で操作できるためです。
pandasの書式には二つあって、DataFrameとSeriesです。
下図は、DataFrameの場合の例です。Excelのように行列データ構造であって、必ず行名と列名を定義する必要があります。指定がない場合は数字で自動に割り当てられます。
一方、下図はSeriesの場合の例です。一見、2列に見えますが1列のデータ構造です。つまり、1次元構造であって列名はありません。但し、行名が必要です。指定がない場合は自動で数値が行番号としてあてがわれます。ちなみに、下図は上図のJulの列を抽出したものです。
■2. numpy
numpyは、行列データ、もしくは1次元のデータの演算で使用します。ndarrayと呼ぶ書式で、print表示した場合、下図のように要素間がカンマ区切りではなく、隙間が空いて表記されます。
■3. list
リストは、どのプログラミング言語にもあるように配列のことです。print表示した場合、下図のように要素間はカンマ区切りで表記されます。そのため、見た目には、numpyアレイとの識別はこのカンマの有無で出来ます。
以下は、雛形コードです。
次の1~4の流れに沿って、私が頻繁に使用するコードを備忘録として記載します。
1. 行列データファイルをpandasで読み込み
2. 行列データの前処理をする
3. numpyもしくはscikit-learnなどで計算
4. 最後にファイル保存
import pandas as pd
import numpy as np
def load_file():
df = pd.read_csv(my_input, delimiter=',', index_col=0, header=0)
print('df')
print(df)
print(type(df))
my_columns = df.columns
print('my_columns')
print(my_columns)
dfb = df.dropna(axis='columns')
print('dfb')
print(dfb)
print(type(dfb))
dfc = df.loc[my_index, :]
print('dfc')
print(dfc)
print(type(dfc))
df3 = df.loc[:, my_col]
print('df3')
print(df3)
print(type(df3))
dfe = df3.drop(my_index)
print('dfe')
print(dfe)
print(type(dfe))
val = df.loc[my_index, my_col]
print('val of ' + my_index )
print(val)
val3 = df3[my_index]
print('val3 of ' + my_index )
print(val3)
nd = df3.to_numpy()
print('mynp')
print(nd)
print(type(nd))
mylist = nd.tolist()
print('mylist')
print(mylist)
print(type(mylist))
nd2 = np.array(mylist)
print('nd2')
print(nd2)
print(type(nd2))
my_sum = np.sum(nd)
print('my_sum')
print(my_sum)
dfd = df3 * 0.1
print('dfd')
print(dfd)
print(type(dfd))
valA = val3 / my_sum
print('valA = val3 / my_sum')
print(valA)
print(round(valA, 3))
print("{0:.2e}".format(valA))
print('df.shape')
print(df.shape)
print('len(df)')
print(len(df))
print('len(df.columns)')
print(len(df.columns))
odd_list = [n for n in range(len(df)) if n % 2 == 1]
print(odd_list)
even_list = [n for n in range(len(df)) if n % 2 == 0]
print(even_list)
df_o = df.iloc[odd_list]
df_e = df.iloc[even_list]
df_con = pd.concat([df_o, df_e])
print('df_o')
print(df_o)
print('df_e')
print(df_e)
print('df_con')
print(df_con)
df_con2 = pd.concat([df, df_o], axis=1, join='inner')
print('df_con2')
print(df_con2)
df_con.to_csv('df_con.csv', \
sep=',', index=False, encoding='utf-8', header=True)
if __name__ == '__main__':
input_file = './vegetables.csv'
extract_column = 'Jul'
extract_index = 'cucumber'
load_file()
以上
<広告>
リンク
リンク
リンク