Series
DataFrame
例として、機械学習の入門書でよく使用される iris データセットを使用する。
import pandas as pd
df = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data", header=None, encoding='utf-8')
行名・列名の変更
行方向はインデックスindex
、列方向はcolumns
で指定できる。
df.set_axis(['Row1', 'Row2', 'Row3'], axis=0) # 行名を一括で変更 (行数と引数の要素数は合わせましょう)
df.set_axis(['Row1', 'Row2', 'Row3'], axis='index') # 行名を一括で変更
df.set_axis(['A', 'B', 'C', 'D', 'E'], axis=1) # 列名を一括で変更 (列数と引数の要素数は合わせましょう)
df.set_axis(['A', 'B', 'C', 'D', 'E'], axis='columns') # 列名を一括で変更
デフォルトではデータフレームは修正されないので:
df.set_axis(['A', 'B', 'C', 'D', 'E'], axis=1, inplace=True)
また上記の方法とは別に、
df.index = ... # 何らかのtupleを渡すことができる
df.columns = ['A', 'B', 'C', 'D', 'E']
でも修正できる。この場合は元の DataFrame も修正される。
1行ずつ解析
# (1)
for index, row in df.iterrows():
# index : インデックスの数字
# row : pandas.Series
# (2)
for row in df.itertuples():
# row : pandas.core.frame.Pandas
# (3)
for row in df.itertuples(name=None):
# row : 通常の tuple
# ex. 0列目の値を参照する
print(row[0])
要素にアクセスする
df.head() # 冒頭の表示、引数に数字を入れることでprintする行数を指定できる
df.tail() # 末尾の表示、<同上>
簡単なDataFrame
に対して解説する(6行4列、要素は乱数で初期化された値)
import numpy as np
np.random.seed(123)
df_rnd = pd.DataFrame(
np.random.randn(6,4),
index=['R-0', 'R-1', 'R-2', 'R-3', 'R-4', 'R-5'],
columns=['C-0', 'C-1', 'C-2', 'C-3'])
# C-0 C-1 C-2 C-3
# R-0 -1.085631 0.997345 0.282978 -1.506295
# R-1 -0.578600 1.651437 -2.426679 -0.428913
# R-2 1.265936 -0.866740 -0.678886 -0.094709
# R-3 1.491390 -0.638902 -0.443982 -0.434351
# R-4 2.205930 2.186786 1.004054 0.386186
# R-5 0.737369 1.490732 -0.935834 1.175829
# 行の情報を持ってくる
df_rnd.loc["R-0"] # 行ラベルでアクセスする
df_rnd.iloc[0] # index番号でアクセスする(ラベル名でのアクセスと同じ結果)
# 複数行の情報を持ってくる
df_rnd.loc[['R-0', 'R-1']]
df_rnd.loc[0:2]
# 列の情報を持ってくる
df_rnd.loc[:, "C-0"] # 列ラベルでアクセスする
df_rnd.iloc[:, 0] # 列インデックスでアクセス(2人のageを持ってこれる)
基本的な使い方
リストからDFを作成
リストを用意して、それを用いてDataFrameを初期化すると簡単に作成することができる。
>>> import pandas as pd
>>> list = [["2020/01/01", "12:30", "Yamada", "寝た"], ["2020/01/02", "13:30", "Tanaka", "帰省した"]]
>>> pd.DataFrame(data=list)
0 1 2 3
0 2020/01/01 12:30 Yamada 寝た
1 2020/01/02 13:30 Tanaka 帰省した
>>> pd.DataFrame(data=list, index=["A","B"], columns=["日付", "時間", "名前", "行動"])
日付 時間 名前 行動
A 2020/01/01 12:30 Yamada 寝た
B 2020/01/02 13:30 Tanaka 帰省した
DataFrameからSeries
DataFrameのいち部分を切り取ると、Seriesが返ってくる。
>>> list = ["a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b", "c", "c"]
>>> df = pd.DataFrame(list)
>>> type(df)
<class 'pandas.core.frame.DataFrame'>
>>> type(df[0])
<class 'pandas.core.series.Series'>
テクニック
以下のデータフレームは
list = [['', '', '']]
df = pd.DataFrame()
要素を数える
value_counts()
# DataFrame
df = pd.read_csv("input.csv")
df.loc[0] // 0行目の取得
df.["列名"] // 指定したcolumn(=列)の値の取得
df.at[0,1] // 0行1列目のデータを取得
df.at[0,"列名"] // 0行目
len(df) 行数
len(df.columns) 列数
## 削除
drop
df.drop(columns='カラム名', axis=1) #行なら1
## 抽出
df[ df['year'].str.contains('2020')]