差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
programming:python:packages:pandas:update_multi_column [2019/06/12] – [DataFrameの値の更新 - pandas] ikatakos | programming:python:packages:pandas:update_multi_column [2019/06/13] – ikatakos | ||
---|---|---|---|
行 1: | 行 1: | ||
======DataFrameの値の更新 - pandas====== | ======DataFrameの値の更新 - pandas====== | ||
- | pandasは、DataFrameへのアクセス方法がいろいろあり、お世辞にも統一的とは言えないので、よく「この書き方でいいんだっけ」と混乱する。 | + | pandasは、DataFrameへのアクセス方法がいろいろあるため、値の取得・代入もよく「この書き方でいいんだっけ」と混乱する。 |
- | 基本は、以下のサイトがまとまっている。 | + | 基本的には(一般的な代入と同じく)左辺で更新するデータ範囲を、右辺で値を指定するのだが、左辺のデータ範囲の指定方法が様々あるのに加え、右辺での値の指定にも複数方法がある。 |
- | | + | |
+ | |||
+ | col1 が 3 である行の col2,col3 列を、ともに同行の col4 の値にする | ||
大別すると以下の感じ。 | 大別すると以下の感じ。 | ||
- | 左辺に例えば配列を渡しても、アクセス方法や配列の中身によって、名前か、添字か、boolか、どのように解釈されるか異なってくるのがややこしさの元となる。 | + | 左辺のアクセス関数に例えば配列を渡しても、関数の種類や配列の中身によって、名前か、添字か、どのように解釈されるか異なってくるのがややこしさの元となる。 |
- | * 左辺のアクセス方法 | + | * 左辺のアクセス関数 |
* '' | * '' | ||
* '' | * '' | ||
* '' | * '' | ||
- | * 左辺のアクセスに指定できる値 | + | * 左辺のアクセス関数の引数に指定できる値 |
- | * 単一の名前 | + | * 単一の名前、単一の添字 |
- | * 単一の添字 | + | * 名前の配列、添字の配列 |
- | * 名前の配列 | + | * 名前のslice、添字のslice |
- | * 添字の配列 | + | |
- | * 名前のslice | + | |
- | * 添字のslice | + | |
* 列数と同じ長さのbool配列 | * 列数と同じ長さのbool配列 | ||
* 行数と同じ長さのbool配列 | * 行数と同じ長さのbool配列 | ||
* DataFrame | * DataFrame | ||
+ | * Series | ||
* 右辺の指定方法 | * 右辺の指定方法 | ||
* 単一の値 | * 単一の値 | ||
行 31: | 行 31: | ||
'' | '' | ||
- | また、添字は負の値で末尾から数えられるなど、通常の配列の添字と同じようなものである。 | + | また、添字は負の値で末尾から数えられるなど、通常の配列の添字と似た機能を持つ。 |
| | ||
行 41: | 行 41: | ||
行の添字 行の名前 | 行の添字 行の名前 | ||
- | 配列は numpy.ndarray | + | 配列は numpy.ndarray でもよい。 |
- | ====データの扱われ方==== | + | ====範囲の指定方法==== |
+ | |||
+ | データ範囲の指定方法は、以下のサイトがまとまっている。 | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | loc, ilocは原則 '' | ||
+ | |||
+ | 対してgetitemは、なんとなくよく使う方で解釈されるため、便利な反面、行なのか列なのか時と場合で変わり、紛らわしいので注意。 | ||
^ |^ getitem | ^ |^ getitem | ||
行 51: | 行 59: | ||
| ::: | slice\\ '' | | ::: | slice\\ '' | ||
| ::: | DataFrame | | ::: | DataFrame | ||
- | | カンマ区切りで2番目の値\\ [○○, ●●] | + | | カンマ区切りで2番目の値\\ [○○, ●●] |
| ::: | bool配列 | | ::: | bool配列 | ||
| ::: | その他配列 | | ::: | その他配列 | ||
行 126: | 行 134: | ||
</ | </ | ||
+ | |||
+ | =====代入値の指定方法===== | ||
+ | |||
+ | FIXME | ||
+ | |||
+ | |||
=====SettingWithCopyWarning===== | =====SettingWithCopyWarning===== | ||
行 146: | 行 160: | ||
# 1 | # 1 | ||
- | df.col1[df.col1 == 2] = 100 # OK | + | df['col1'][df['col1' |
- | df[df.col1 == 2].col1 = 100 # SettingWithCopyWarning | + | df[df['col1' |
- | df.col1[df.col1 > 1][df.col1 < 3] = 100 # NG(特に警告も出ない) | + | df['col1'][df['col1' |
- | df.loc[df.col1 == 2, ' | + | df.loc[df['col1' |
</ | </ | ||
- | '' | + | 1番目の書き方、'' |
- | '' | + | 2番目の書き方、'' |
- | 3番目も同様。'' | + | 3番目も同様。'' |
- | '' | + | 4番目の'' |
- | pandasでは '' | + | pandasでは '' |
こういうコードを書くと警告が出る。 | こういうコードを書くと警告が出る。 | ||
行 177: | 行 191: | ||
* [[https:// | * [[https:// | ||
- | 上記を読めば後段の説明は不要なのだが、まぁ、せっかくだし残しておこう。 | + | 上記を読めば下記の回避方法の説明は不要なのだが、まぁ、せっかくだし残しておこう。 |
====回避方法==== | ====回避方法==== | ||
行 198: | 行 212: | ||
</ | </ | ||
- | 行と列を一度に指定してDataFrame内の要素を抽出する方法は、at, iat, loc, iloc がある。 | + | 行と列を一度に指定してDataFrame内の要素を抽出する方法は、loc, |
+ | 他にもatとかixとかあるが、柔軟に解釈してくれるおかげでさらに紛れが発生しやすいので、基本はこの2つだけ覚えておけばよい。 | ||
* [[https:// | * [[https:// | ||
- | ===列はカラム名、行はindexで指定=== | + | ===列は名前、行は添字で指定=== |
- | < | + | locは「行も列も名前で指定する」、ilocは「行も列も添字で指定する」のどちらかしか無く、「列は名前で指定したいが、行は添字で指定したい」時に困る。 |
- | 「インデックス」はDataFrameをprintした時に左にある行名(上の例だと100, | + | |
- | 「index」は、各行各列が先頭から何番目か(配列の添字と一緒、0, | + | |
- | </ | + | |
- | locは「行も列も名称, | + | 劇的な解決とはいかないが、以下の解決策がある。 |
- | 劇的な解決とはいかないが、「あらかじめ目的行のインデックスを調べてからlocを使う」または「あらかじめ目的列のindexを調べてからilocを使う」ことで回避できる。 | + | * あらかじめ目的行の名前を調べてからlocを使う |
+ | * あらかじめ目的列の添字を調べてからilocを使う | ||
* [[https:// | * [[https:// | ||
<sxh python> | <sxh python> | ||
- | # あらかじめ目的行のインデックスを調べてからlocを使う | + | # 名前で[' |
- | rows = df.index[[1, | + | |
- | df.loc[rows, [' | + | # 【あらかじめ目的行の名前を調べてからlocを使う】 |
- | print(df) | + | df.index |
+ | # => [100 200 300] | ||
+ | df.index[[1, | ||
+ | # => [200 300] | ||
+ | df.loc[df.index[[1, | ||
+ | df | ||
# => | # => | ||
# col1 col2 col3 | # col1 col2 col3 | ||
行 227: | 行 245: | ||
- | # あらかじめ目的列のindexを調べてからilocを使う | + | # 【あらかじめ目的列のindexを調べてからilocを使う】 |
- | col2_idx = df.columns.get_loc(' | + | df.columns |
+ | # => [' | ||
+ | col2_idx = df.columns.get_loc(' | ||
col3_idx = df.columns.get_loc(' | col3_idx = df.columns.get_loc(' | ||
- | df.iloc[[1, 2], [col2_idx, col3_idx]] = 40 | + | |
- | print(df) | + | df.iloc[[1, 2], [col2_idx, col3_idx]] = 40 # これをilocに用いることで、目的が達成される |
+ | df | ||
# => | # => | ||
# col1 col2 col3 | # col1 col2 col3 |