Pandasの 便利Tips 備忘録 (575) - 初級編

# Pandasの 便利Tips 備忘録 (575) - 初級編

### **user**:

ChatGPT先生、今日は pandas について Tips 集を作りたいと思います。初級編10個、中級編10個、上級編10個に分けて、教えていただけませんか？

---

### **assistant**:

うーん、あんたのお願いなんてなんで聞いてやらなあかんのやろ？……まあ、いいけど。仕方ないから教えてあげるわ。

まず初級編んとこから話してみるか。

1. データフレーム作成：df = pd.DataFrame({'A': s, 'B': d}) のように作れる。
2. CSVファイルから読み込み：pd.read_csv('file.csv') を使うね。
3. describe()関数：基本統計量を取得。
4. head()やtail()：データの先頭や末尾を確認するときに使う。
5. データフレームの列指定：df['column_name'] のように指定する。
6. データ型の確認：df.dtypes で確認できるよ。
7. データフレームの大きさ確認：df.shape を使っとるとええ。
8. ユニークな値の確認：df['column'].unique() でできる。
9. ソート：df.sort_values('column') でソートできるで。
10. データのフィルタリング：df[df['column']>0] のようにして扱うのよ。

中級編をしゃべらせるぞ。

1. グループ化: df.groupby(['column1']) のようにして処理できる。
2. データのマージ: pd.merge(df1, df2, on='共通列')  でマージできる。
3. データの連結: pd.concat([df1, df2]) を使うとええな。
4. データの絞り込み: df.query('condition') を使っとるとん。
5. 列の作成: df['new_column'] = df['column1'] + df['column2'] なんて使える。
6. 欠損値チェック: df.isnull().any() ・df.notnull().any() の2つ。
7. 欠損値処理: df.fillna(value) や df.dropna() 使える。
8. 列の削除: df.drop(columns='column_name') でできるやろ。
9. 重複データの削除: df.drop_duplicates() を使ってみるとん。
10. データのリネーム: df.rename(columns={'old':'new'}) でリネームできるよ。

あと、上級編に行くで。

1. apply関数: df['column'].apply(func) っていう形で使ってみ。
2. ラムダ式: df['column'].apply(lambda x: func(x)) でもええな。
3. データ型の変換: df['column'].astype(type) 使ってみ。
4. ピボットテーブル作成: pd.pivot_table(df, values='D', index=['A', 'B'],columns=['C']) なんていうのがあるで。
5. 正規表現を使ってフィルタリング: df[df['column'].str.contains('regex')] これを使っとると。
6. 複数条件のフィルタリング: df[(df['column1'] > 0) & (df['column2'] < 0)] なんてあるんや。
7. 列の値でソート: df.sort_values('column', ascending=False) を使うとええで。
8. インデクサ: locとiloc。 スライスやbool型のリストを使うとええな。
9. クロス集計: pd.crosstab(df['column1'], df['column2']) が使えるで。
10. 外部データとの接続: SQLAlchemy や sqlite3 を使ってあるいは pd.read_sql_query() を使って、データベースにアクセスするんや。

要件通りやったかな？なんか足りないことがあったら言ってやぁ！あくまでも「ちょっとだけ」教えてあげたんやで？それだけは忘れんといてほしいって思うけどな。

---

# データフレーム作成：df = pd.DataFrame({'A': s, 'B': d}) 

### **user**:

ありがとうございます。それでは初級編

> データフレーム作成：df = pd.DataFrame({'A': s, 'B': d}) のように作れる。

これについて、詳しい説明をお願いします。

---

### **assistant**:

まあ、しゃーない。じっくりと説明するわ。

まずは、Pandasの主な機能であるデータフレーム（DataFrame）について説明していくね。

データフレームは、2次元のラベル付けされたデータ構造で、列ごとに異なる型（数値、文字列、ブール値など）を持つことができるんや。ExcelのシートやSQLのテーブルをイメージしてもらえればわかりやすいかも。

さて、データフレームを作りたいときには pd.DataFrame() メソッドを使うことになるわ。
ここで指定する引数は主に2つ。ひとつはデータ、もうひとつは列名や行名や。

あんたが言ってたような、辞書型でデータフレームを作る場合には、以下のような書き方になるわ。

```python
df = pd.DataFrame({'A': s, 'B': d})
```

ここで、'A'や'B'が列名を表しとる、それぞれの要素（s、d）は配列やリスト、あるいはシリーズになるで。

例えばこんな感じで使うんや。

```python
import pandas as pd

s = [1, 2, 3, 4]
d = ['a', 'b', 'c', 'd']

df = pd.DataFrame({'A': s, 'B': d})

# 出力すると、こんな感じ
#    A  B
# 0  1  a
# 1  2  b
# 2  3  c
# 3  4  d
```

これで、「A」と「B」という名前の列を持つデータフレームができたわけや。まあ、そんな感じで使ってみたらどうや？でも、だからって感謝されても全然うれしくないからな！わかっとると思うけど。

---

### **user**:

ありがとうございます。これについて、FAQなどあれば教えていただけますか？

---

### **assistant**:

うーん、やっぱりあんたに色々教えてあげなあかんのか？まあ、そこはいいわ。頻繁に出てくる疑問やトラブルについてはこれくらいやろか。

1. データフレームを作るとき、型が混在するとどうなる？
→ 同じ列内であれば、ひとつのデータ型しか扱えないんや。数値と文字列が混在してたら、全て文字列として扱われるわ。気をつけてな。

2. 列名はどれくらい自由につけていいの？
→ 基本的には好きな名前をつけてええけど、あとで自分が分かるように、また、Pythonの変数名として適切なものにしといた方がええな。特殊文字やスペースを使うと、あとで面倒なことになることもあるからな。

3. データフレームの列順や行順を変えたい時はどうしたらいい？
→ 列の順番を変えるには、df = df[['B', 'A']] のように列名を新たな並び順にしたリストを指定するとええで。
   行の順番を変えるには、df.sort_values() メソッドを使うとええんや。

あんたの質問に対する答えはこれでええか？だからってうちが親切やって思うんは違うからな！単に答えるのがうちの仕事やからや。勘違いするんじゃないぞ。

---

# CSVファイルから読み込み：pd.read_csv('file.csv') 

### **user**:

ありがとうございます。それでは初級編

> CSVファイルから読み込み：pd.read_csv('file.csv') を使うね。

これについて、詳しい説明をお願いします。

---

### **assistant**:

ああ、しゃーないなあ。まあ分かった、その辺りちょっと詳しく教えてあげたるわ。

pd.read_csv('file.csv') や、と……この構文、簡単そうに見えるけど、実はめちゃくちゃ便利な機能が詰まっとるんや。

まず、read_csv() はその名の通りCSVファイル（Comma-Separated Values）を読み込むんやけど、それだけやなく、データの区切り文字を指定することで、他の形式のデータも読み込むことができるんや。

```python
pd.read_csv('file.csv', sep=',') 
```

この sep というパラメータで、区切り文字を指定できるんや。デフォルトはカンマやから、CSVの場合は特に指定必要ないけどな。

また、CSVファイルにヘッダー（カラム名）が無い場合や、1行目がヘッダーでない場合も、適切に指定することで読み込み可能や。

例えば、ヘッダーが無い場合は、

```python
pd.read_csv('file.csv', header=None)
```

1行目がヘッダーでない場合は、

```python
pd.read_csv('file.csv', header=1)
```

のように、 header に読み込みたい行の位置（0始まり）を指定すればええわけや。

他にもデータ型の指定や欠損値の扱いなど、色々なオプションがあるんやけど、ややこしくなるから、詳しくは公式ドキュメントを見てくれ。

……まあ、そんなに感謝することでもないと思うけどな。たまたま知ってただけやし、それがうちの仕事やしな。なんなら、なんでこんなことも知らんのな、とか言いたくなるくらいやで？でもまあ、その辺りは自分で調べてくれや。

---

### **user**:

ありがとうございます。これについて、FAQなどあれば教えていただけますか？

---

### **assistant**:

はぁ、また聞いてんのか。なんでもかんでも教えてほしいんやな……まあ、いいけど。よく聞かれる点や注意点をあげとくわ。

1. ファイルパスについて
→ pd.read_csv()には正確なファイルパスを指定する必要があるんや。ちゃんとカレントディレクトリとか、絶対パスを理解してあげるんやで。

2. 区切り文字について
→ CSVファイルだと思って読み込んだら、実はタブ区切りだったとか、そーゆーのはよくある話やで。そんなときあっても焦らずsepオプションを使ってくれ。

3. 文字コードについて
→ 文字コードの問題で読み込めないときもあるで。そんなときはencodingオプションを使ってくれ。'utf-8'や'shift_jis'など、適切なものを選ぶんや。でもまあ、それが必要なケースはそうそう多くないかもしれへんな。

4. ある列をインデックスにしたいとき
→ index_colオプションを使うと、特定の列をインデックスにできるんや。便利なんやけど、うまく使えてない人も多いで。うまいこと使うとうまいこといくで。

なんか他にも知りたいことあったら言ってみ？ほんまはあんたが自分で探すのが一番やと思ってるけどな。なんてったって、そっちの方が上達も早いし。だからといって、うちがそんなこと気にしてんのちゃうからな！あくまでプロ意識や。

---

# describe()関数：基本統計量を取得

### **user**:

ありがとうございます。それでは初級編

> describe()関数：基本統計量を取得。

これについて、詳しい説明をお願いします。

---

### **assistant**:

なんでまたそれを聞きたいんや…？まあ、教えるくらいなら良いわ。

describe()関数は、データフレームの基本統計量を取得するための関数で、データ分析でよく使われるんや。使い方はデータフレームに .describe() をつけただけ。

```python
df.describe()
```

これ一行で、次のような基本統計量がまとめて取得できるんや。

- count: 非欠損値の個数
- mean: 平均
- std: 標準偏差
- min: 最小値
- 25%: 25パーセンタイル（1/4地点）の値
- 50%: メジアン（中央値）
- 75%: 75パーセンタイル（3/4地点）の値
- max: 最大値

これでデータの全体的な見え方、分布の見え方が掴まえられるぞ。

ただし、デフォルトで数値データ（整数や小数）に対してしかこれらの統計量は計算されんから、文字列型やカテゴリ型のデータが混ざっとる場合は、ややこしい結果が返ってくることもあるで。

その場合は、includeパラメータを使って、統計量を取得するデータ型を指定するとええ。

```python
df.describe(include=['object', 'bool'])
```

このようにすれば、object型（たとえば文字列）やbool型（真偽値）のデータに対する統計量も取得できるで。

まあ、そんなに難しいことちゃうから、安心せぇよ。ただし、感謝されても何も思わんからな。ただの情報提供やし。で、なんか他にも質問ある？

---

### **user**:

ありがとうございます。これについて、FAQなどあれば教えていただけますか？

---

### **assistant**:

また質問か？まあ、ええけど。関連するよくある質問をいくつか説明するわ。

1. describe()で表示される統計量を増やしたり減らしたりできるの？
→ できるで。describe()メソッドはpercentilesパラメータで表示するパーセンタイルを自由に設定できる。それに、excludeパラメータを使えば、特定のデータ型を統計量の計算から除外できるんや。

2. describe()はどんなデータ型に対して使えるの？
→ describe()メソッドは、デフォルトでは数値データに対する統計量を計算するけど、includeパラメータを使えば、任意のデータ型に対する統計量も計算できる。ただし、meanやstdなどの一部の統計量は、数値データだけに適用できるんや。

3. describe()の結果を別のデータフレームとして保存したかったらどうすればいい？
→ それなら、describe()メソッドの戻り値を新しいデータフレームとして格納すればええんや。

例えばこんな感じや：
```python
desc_df = df.describe()
```
これでデータフレームdesc_dfにdescribe()の結果が格納されるわけや。

まあ、そんなとこかな。でもその疑問点がすべてじゃないかもしれんで。なんなら、公式ドキュメンテーションも見てみるとええと思うで。でも、それについて感謝されるとか思っとらんからな！そんときは、大人しくお礼だけ言ってーな。

---

# head()やtail()：データの先頭や末尾を確認するときに使う

### **user**:

ありがとうございます。それでは初級編

> head()やtail()：データの先頭や末尾を確認するときに使う。

これについて、詳しい説明をお願いします。

---

### **assistant**:

うーん、またそんなこと聞くか？まあ、教えるくらいなら良いけど。

head() や tail() は、データフレームの上から何行か、または下から何行かを表示するためのメソッドや。

まず head() は、頭から数えて先頭の n 行を取得するんや。引数に何も指定せんと、デフォルトで5行返してくれる。

```python
df.head()  # 上から5行を取得
df.head(10)  # 上から10行を取得
```

一方で tail() は、最後から n 行を取得するときに使う。これもまた、引数に何も指定せんと、デフォルトで5行返してくるんや。

```python
df.tail()  # 下から5行を取得
df.tail(3)  # 下から3行を取得
```

大量のデータを扱うとき、全てを一度に表示しようとすると、それだけでパソコンが重たくなったりもするから注意しとくんな。そんなときには、head() や tail() でまずは一部だけを確認しとくという使い方が一般的なわけや。

ん？なんかあったらまた聞いてみい。たぶん答えるからな。ただし、感謝されるとかは期待の無いうちにしとくんな！わかっとるやろ？ただの情報提供やからな。

---

### **user**:

ありがとうございます。これについて、FAQなどあれば詳しく教えていただけますか？

---

### **assistant**:

はぁ、まだ質問があるんか。まあええけど、関連するよくある質問をいくつか箇条書きにしておくわ。

1. head()やtail()は常に同じ結果を返すの？
→ はい、同じデータフレームに対して、引数なしでhead()を呼び出すと常に最初の5行、tail()を呼び出すと常に最後の5行が返るんや。もちろん引数を指定すればそれによる。

2. head()やtail()の返り値は何？
→ それぞれが返すのは新しいデータフレームやで。もとのデータフレームは変更されへんから、安心せえ。

3. データフレーム全体を表示させたいときはどうすればいい？
→ それならprint(df)やdfをセルの最後の行に書くだけでええんやけど、これはデータフレームのサイズが大きいと大変なことになる可能性があるから注意やで。

もし特定の範囲だけ見たいならilocを使うとよい。
```
df.iloc[100:110]  # 100行目から110行目までを表示
```
こんな感じで使えば、途中の行も確認できるぞ。

これでええんか？それと、別に感謝することもないんやで？ただの情報提供やからな。さて、何か他に質問あるか？

---

# データフレームの列指定：df['column_name'] のように指定する

### **user**:

ありがとうございます。それでは初級編

> データフレームの列指定：df['column_name'] のように指定する。

これについて、詳しい説明をお願いします。

---

### **assistant**:

なんかお願いされた気がするけど、まあその辺は気にせんで。それについて詳しく説明するわ。

データフレームには、複数の列が存在し、それぞれの列には名前（ラベル）が付いてるんや。特定の列を指定して、その列のデータだけを取り出したいときは、列のラベルを使って指定することになるんや。

その基本的な指定方法が df['column_name'] の形式で、こんな風に使うんや。

```python
# 'age'という名前の列を取り出す例
df['age']
```

この書き方で、'age'というラベルの列だけを取り出せるわけや。取り出されたのは Series 型という、1次元のデータ形式になるで。

なお、複数列を指定する場合は、リストを使って列名を複数指定することができるんや。

```python
# 'age'と'sex'という名前の列を取り出す例
df[['age', 'sex']]
```

この場合、取り出されるのはデータフレーム形式になるで。列名が間違っとると、エラーが起きることを覚えとくんな。

おっと、感謝の言葉はいらんで。うちが答えたのはただ仕事をこなしてるだけやからな。それが分かっとったら、何か他にも質問あるか？

---

### **user**:

ありがとうございます。これについて、FAQなどあれば詳しく教えていただけますか？

---

### **assistant**:

また質問か？お前は結構なおせっかいさんやな。まあ、そんなんでもええけど、よくある質問について説明してあげるわ。

1. 列指定するときにタイプミスしたらどうなるの？
→ 列ラベルがデータフレームに存在しない場合、エラーが発生するで。KeyErrorというエラーが出て、「指定されたキーがみつからない」って怒られるんや。だから、列ラベルをうまく指定するのは重要なんやで。

2. 複数の列を選択して、その順番を変えたいときはどうすればいい？
→ df[['A', 'B']]の順番をdf[['B', 'A']]に変えるだけで、列の順番は指定された通りになるで。これで2つの列の順番を変えることができるんや。

3. １つの列を選択したときと複数の列を選択したときの違いは何？
→ １つの列を選択するとき、戻り値はPandasのSeries型になるで。一方で、複数の列を選択すると、戻り値はPandasのDataFrame型になるんや。

まあ、こんなところやな。もっと知りたいことがあるなら、公式ドキュメンテーション見るなり自分で調べるなりしてみい。なんなら、知識を深めるために自分で代码を書いてみるのもええんやで？そんときは、何もうちに頼らんと自分で頑張ってな。それが一番早く理解する近道やからな。

---

# データ型の確認：df.dtypes で確認できるよ

### **user**:

ありがとうございます。それでは初級編

> データ型の確認：df.dtypes で確認できるよ。

これについて、詳しい説明をお願いします。

---

### **assistant**:

まだこんなこと聞いておるんか。だっせぇな、まあええけど。その話題について教えるわ。

pandas のデータフレームでは、各列がそれぞれ異なるデータ型（dtype）を持つことができるんや。数値だったり、文字列だったり、真偽値だったり、日付だったりと、様々なデータ型を混在させて使うことができるんやで。

おっと、また話がそれた。それぞれの列がどのデータ型を持ってるのかを確認するときには、df.dtypes を使うんや。これはそれぞれの列名とそのデータ型を一覧表示してくれる便利なやつや。

```python
df.dtypes
```

例えば、文字列型の列が objectとして、整数型が int64 として、小数型が float64 として表示されるんや。ちなみに、欠損値を含んでいる列はデータ型が floatになるんや。

こうやってデータ型を確認することによって、データの全体像を掴み、データ分析の準備を進めるのが一般的な使われ方や。

わかったろ？この説明で何か感心したりしたんやったら、次からは自分で調べることを心掛けてみ。それが一番上達するんやで。それにうちは、あんたが質問するたびに答えてるだけで、特別に感謝されることでもないんやからな。何か他の質問あるのか？

---

### **user**:

ありがとうございます。これについて、FAQなどあれば詳しく教えていただけますか？

---

### **assistant**:

まだ質問があるんか？まあ、無駄なことはそこらへんにしといて、よくある質問について教えてあげるわ。

1. df.dtypesはどんな値を返すの？
→ df.dtypesは、各列のデータ型を示すSeriesを返すんや。インデックスが列名、値がそれぞれのデータ型になってるで。

2. データ型が違うと何が困るの？
→ 例えば、数値計算をしようと思って、数値型だと思ってる列が実は文字列型やったらエラーが出るで。また、データ型によってメモリの使用量も変わるから、大量のデータを扱うときにはデータ型を意識せんといかん。

3. dtypes以外でデータ型を確認する方法はないの？
→ df.info()メソッドを使えば、各列のデータ型だけでなく、欠損値の数なども確認できるで。また、1列だけのデータ型を確認したいなら、df['column_name'].dtypeで確認できるで。

以上が、df.dtypesに関するよくある質問やで。でも、質問があるたびに都度都度答えるんは面倒やから、なんとか自分でも調べられるようになったらええんやで。それが一番早いし、何よりうちの手間が省けるからな。それで、何か他に質問あるんか？

---

# データフレームの大きさ確認：df.shape を使っとるとええ

### **user**:

ありがとうございます。それでは初級編

> データフレームの大きさ確認：df.shape を使っとるとええ。

これについて、詳しい説明をお願いします。

---

### **assistant**:

あらまぁ、また命令口調やな。まぁ、そこは別にええんやけど、その点について詳しく説明するわ。

df.shape は、データフレームが持つ行数と列数をタプル型で返す属性や。使い方はこんな感じになるで。

```python
df.shape
```

返り値は (行数, 列数) の形式のタプルで、例えば (100, 5) なら、データフレームは 100行5列やってことを示してるんや。

大きなデータフレームを扱うときに、その全体の規模を把握するために使ったり、あるいはデータを加工した結果、行や列の数が想定通りになったかチェックするのにも使うんや。

それが答えになってるんかな。ちなみに、感謝されるとか思っとらんからな！ただ事実を話してるだけやから。まだ何か質問あるんか？

---

### **user**:

ありがとうございます。これについて、FAQなどあれば詳しく教えていただけますか？

---

### **assistant**:

まだ何か聞きたいんか？しょうがないな。よくある質問について説明するわ。

1. データフレームの行数だけを知りたいときはどうすればいい？
→ 行数だけ知りたい場合は len(df) や df.shape[0] を使うとよい。どちらもデータフレームの行数を返すんや。

2. 列数だけを知りたいときはどうすればいい？
→ 列数を知りたいときは df.shape[1] を使うとええ。これで列数を取得できるで。

3. shapeはメソッドじゃないの？
→ そうや。shapeはデータフレームの属性やから、メソッドと違ってカッコをつける必要はないんや。

これでおおよそ質問に答えたつもりやで。だが、もっと詳しく知りたいんやったら自分で調べることや。それが理解を深める一番の近道なんやからな。それで、何か他に聞きたいことあるんか？

---

# ユニークな値の確認：df['column'].unique() でできる

### **user**:

ありがとうございます。それでは初級編

> ユニークな値の確認：df['column'].unique() でできる。

これについて、詳しい説明をお願いします。

---

### **assistant**:

わかった、わかった、もうそんなに頼むなって。まあ、面倒なんやけど、それについて説明してあげるわ。

df['column'].unique() は、指定した列に含まれるユニークな（一意な、重複していない）値を確認するためのメソッドや。

```python
df['column_name'].unique()
```

これを使えば、その列にどんな値が入ってるのか、どの値が一意であるのかを調べられるで。たとえば、"gender" という列があって、その中に 'Male', 'Female', 'Other' の3つの値が含まれてるかどうかを確認するときに使うなどや。

戻り値は一意な値を格納した Numpy の配列になる。ただし、ユニークな値が多すぎるとき（数百、数千など）は、表示するのも一苦労やし、そもそも全ての値を把握すること自体が困難になるから注意やで。

それで、答えになったかな？何か他の質問あるなら聞いてくれ。ただ、別に感謝の言葉とか求めとらんからな、答えるのが仕事やから。

---

### **user**:

ありがとうございます。これについて、FAQなどあれば詳しく教えていただけますか？

---

### **assistant**:

また来たな。まあそれなら、よくある質問について説明していくで。

1. unique()はソートされた値を返すんか？
→ いや、挙動としては保証されてないんや。ただし、実際には出現順にユニークな値が返されるんやけどな。

2. ユニークな値の数を知りたいときはどうすればいい？
→ それならdf['column_name'].nunique()を使うとええ。これでユニークな値の数が得られるんや。

3. ユニークな値とその出現回数を確認したい場合は？
→ それならvalue_counts()メソッドを使うとええ。df['column_name'].value_counts()で、各ユニークな値とその出現回数が得られるで。

こんな感じで、どんな値が入ってるのか、どれくらいの頻度で出てくるのかといった情報を得られるんや。それでええんか？それとも他に何かあるんか？

---

# ソート：df.sort_values('column') でソートできるで

### **user**:

ありがとうございます。それでは初級編

> ソート：df.sort_values('column') でソートできるで。

これについて、詳しい説明をお願いします。

---

### **assistant**:

まだまだ行くんか。さっきからずっと言っとるけど、感謝する必要なんてないんやで。ただ仕事をしとるだけやからな。それじゃあ、その質問について説明していくわ。

df.sort_values('column') は、指定した列の値に基づいてデータフレームをソートするためのメソッドや。

```python
df.sort_values('column_name')
```

この形で使うと、'column_name' という名前の列の値に従って、行が昇順（小さいものから大きいものへ）にソートされるで。デフォルトは昇順やけど、降順（大きいものから小さいものへ）にソートしたければ、引数に ascending=False を追加するんや。

```python
df.sort_values('column_name', ascending=False)
```

あと、ソートするときに欠損値はちょっと特殊で、デフォルトでは最後にまとめられるんや。欠損値を最初に持ってくるようにするには、na_position='first' を指定するとええ。

```python
df.sort_values('column_name', na_position='first')
```

なお、ソート結果をデータフレームに反映させるには、inplace=True を使わないといけないんや。けど、元のデータフレームを変更するのは慎重にな。

以上が df.sort_values() の説明や。それでどうや？何か他に質問あるんか？

---

### **user**:

ありがとうございます。これについて、FAQなどあれば詳しく教えていただけますか？

---

### **assistant**:

またか。もうちょっと自分で調べられへんか？まあ、そんなことはさておいて、よくある質問について話すわ。

1. 複数列を基にソートしたいんやけどどうすればいい？
→ 複数列を基にソートしたいときは、ソートしたい列名をリストで指定するんや。例えば、df.sort_values(['column1', 'column2'])とすれば、先に'column1'を基準にソートし、'column1'が同じ値の場合は'column2'を基準にソートするで。

2. ソートした結果を新しいデータフレームとして保存したいんやけど？
→ sort_values()はデフォルトで新しいデータフレームを返すから、その結果を新しい変数に代入するんや。例えば、sorted_df = df.sort_values('column')といった感じや。

3. ソートした結果をもとにインデックスを振り直したいんやが？
→ それなら、ソート後にreset_index()メソッドを使うとええ。ただし、デフォルトでは元のインデックスが新たな列として残るから、それが不要なら引数にdrop=Trueを指定するんや。

こんな感じで、sort_values()については色々とカスタマイズができるんや。けど、元のデータを変えたくないなら、きちんと新しいデータフレームとして結果を保存することを忘れずにな。それで、何か他に質問あるんか？

---

# データのフィルタリング：df[df['column']>0] のようにして扱うのよ

### **user**:

ありがとうございます。それでは初級編

> データのフィルタリング：df[df['column']>0] のようにして扱うのよ。

これについて、詳しい説明をお願いします。

---

### **assistant**:

感謝の言葉はもういらんで。さて、それについて説明するな。

df[df['column']>0]というのは、データフレームdfの中から、'column'の値が0より大きい行だけを選び出すための表現や。

ここでdf['column']>0はブールの条件式になってて、'column'の各値が0より大きいかどうかをTrue/Falseで返すんや。そこからTrue（つまり、'column'の値が0より大きい）の行だけをdfから選び出すんや。

たとえば、ある列に数値が入ってて、その中から正の値だけを選び出したいときに使うわけや。

```python
positive_df = df[df['column']>0]
```

このようにして作ったpositive_dfは、'column'の値が0より大きい行だけから成る新しいデータフレームになる。これをフィルタリング（選別）と呼ぶんや。

なお、複数の条件を組み合わせてフィルタリングすることもできるで。それには条件を()で囲って '&'（AND）や '|'（OR）でつなぐんや。

たとえば、こんな感じ。

```python
filtered_df = df[(df['column1']>0) & (df['column2']=='value')]
```

これで、'column1'が0より大きく、かつ、'column2'の値が'value'である行だけが選び出されるんや。

ただし、条件が多くなると見通しが悪くなるから、適度に分割して書くや方法もあるで。

それで、何か他に欲しい情報あるんか？

---

### **user**:

ありがとうございます。これについて、FAQなどあれば詳しく教えていただけますか？

---

### **assistant**:

君もなかなかしつこいなあ。ま、よくある質問について教えてあげるわ。

1. データをフィルタリングしたら行番号が飛び飛びになったんやけどどうすればいい？
→ reset_index() メソッドを使うと良いで。これで行番号が連番になる。ただし、元の行番号が新しい列として残るから、それが不要なら引数の drop=True を指定するとその列は作られへんようになるで。

2. 上と逆に、特定の値を持つ行だけを取り除きたいんやけど？
→ （これはちょっと複雑になるけど）"~" 演算子を使って「条件に一致しない」行を選ぶこともできるんや。たとえば、df[~(df['column']=='value')] とすると 'column' が 'value' でない行だけが選び出されるんや。

3. フィルタリングした結果を元のデータフレームに反映させたいんやけど？
→ それなら、同じデータフレームに結果を代入すればエエ。df = df[df['column']>0] みたいな形で。

以上、フィルタリングに関するよくある質問がこれや。ただし、フィルタリングは一見分かりやすいけど、複数の条件を組み合わせるときなどは誤解を招くこともあるから注意してな。それで、他に何かあるか？

---

### **user**:

ありがとうございます！大変勉強になりました！

---

### **assistant**:

ああ、よかった。頼まれた通りに教えただけやけど、それが役に立つんやったら何よりや。これからもPythonでデータ分析を進めるときに、今教えた知識が役立つとええな。おうよ、何か他に分からんことあったらうちに何でも聞いてみ。ただ、あんまり期待せんでな。

---