こんにちは、JS2IIUです。
Pandasは、データ分析や前処理の分野で非常に強力なPythonライブラリです。データを操作する中で、複数の列を基に新しい列を生成する必要が出てくる場面は多いです。本記事では、Pandasを使った新しい列の生成方法を13種類に分けて解説します。それぞれの方法にサンプルコードと解説を添えていますので、ぜひ参考にしてください。
1. 計算による新しい列の生成
説明
列の値を直接加減乗除することで、新しい列を作成します。
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df['C'] = df['A'] + df['B'] # AとBの合計
print(df)解説
このコードでは、列AとBの各値を足し合わせて新しい列Cを作成しています。数値計算は、通常のPython演算子で記述可能です。+, -, *, /のような演算子を使用できます。
出力例
A B C
0 1 4 5
1 2 5 7
2 3 6 9参考リンク
2. 条件分岐による新しい列の生成
説明
条件を使って新しい列を作成します。条件分岐にはnp.whereやapplyを使う方法があります。
import numpy as np
df['D'] = np.where(df['A'] > 2, 'High', 'Low') # Aが2より大きいかどうかで判定
print(df)解説np.whereは、第一引数に条件式、第二引数に条件がTrueの場合の値、第三引数にFalseの場合の値を指定します。この例では、Aが2より大きければHigh、それ以外はLowという値が新しい列Dに格納されます。
出力例
A B C D
0 1 4 5 Low
1 2 5 7 Low
2 3 6 9 High参考リンク
3. 列の組み合わせによる新しい列の生成
説明
複数の列の値を結合して新しい列を作成します。
df['E'] = df['A'].astype(str) + '-' + df['B'].astype(str) # AとBを文字列として結合
print(df)解説
数値型の列を文字列型に変換するには.astype(str)を使います。その後、文字列の+演算子で結合しています。この方法は、ラベル付けやカテゴリデータの生成に便利です。
出力例
A B C D E
0 1 4 5 Low 1-4
1 2 5 7 Low 2-5
2 3 6 9 High 3-6参考リンク
4. 関数を使った新しい列の生成
説明applyメソッドを使って、カスタム関数で新しい列を生成します。
def custom_function(row):
return row['A'] * row['B']
df['F'] = df.apply(custom_function, axis=1) # AとBの積
print(df)解説applyはDataFrameの行または列に対して関数を適用します。axis=1と指定すると、行ごとの操作を行います。ここでは、各行のAとBの積を計算しています。
出力例
A B C D E F
0 1 4 5 Low 1-4 4
1 2 5 7 Low 2-5 10
2 3 6 9 High 3-6 18参考リンク
以下は、「その他の方法」の詳細と、それぞれの方法の使い所をまとめた表を追加した記事の続きです。
5. ランダムデータや外部データを使った列の生成
説明
ランダムな値や外部データを新しい列として追加する方法です。
import numpy as np
# ランダムな値を新しい列に追加
df['Random'] = np.random.randint(0, 100, size=len(df))
print(df)解説
このコードでは、NumPyのrandom.randintを使用して0~99のランダムな整数を生成し、新しい列RandomとしてDataFrameに追加しています。外部データを読み込む場合も、類似の方法で列を追加できます。
出力例
A B C D E F Random
0 1 4 5 Low 1-4 4 62
1 2 5 7 Low 2-5 10 91
2 3 6 9 High 3-6 18 43使い所
ランダム値を使ったシミュレーションや、外部データを組み合わせた複雑なデータ分析に便利です。
6. カテゴリデータのマッピング
説明
既存の列に基づいてカテゴリをマッピングする方法です。
mapping = {1: 'One', 2: 'Two', 3: 'Three'}
df['Mapped'] = df['A'].map(mapping)
print(df)解説mapメソッドは辞書型データを受け取り、対応する値を新しい列として追加します。この例では、列Aの値をmapping辞書に基づいて文字列に変換しています。
出力例
A B C D E F Random Mapped
0 1 4 5 Low 1-4 4 62 One
1 2 5 7 Low 2-5 10 91 Two
2 3 6 9 High 3-6 18 43 Three使い所
カテゴリ変数のエンコードや、識別しやすい値の追加に便利です。
7. 条件付き集約を伴う列の生成
説明
条件付きで集約値を新しい列として生成します。
df['Sum_A_B'] = df['A'] + df['B'] # 条件なしで単純集計
df['Conditional_Sum'] = df['Sum_A_B'].where(df['A'] > 1, 0) # 条件付き集約
print(df)解説whereメソッドは条件を満たす場合に元の値を保持し、条件を満たさない場合に代替値を設定します。この例では、Aが1より大きい場合にのみSum_A_Bの値を保持しています。
出力例
A B C D E F Random Mapped Sum_A_B Conditional_Sum
0 1 4 5 Low 1-4 4 62 One 5 0
1 2 5 7 Low 2-5 10 91 Two 7 7
2 3 6 9 High 3-6 18 43 Three 9 9使い所
特定の条件に基づいた集計値を取得する際に便利です。
8. シフトやラグを伴う列生成
説明
前後のデータを使用して新しい列を生成します。
df['Shifted'] = df['A'].shift(1) # 1つ前の値
df['Diff'] = df['A'] - df['A'].shift(1) # 差分
print(df)解説shiftメソッドは行をシフトさせる操作を行います。これにより、時系列データの差分やラグデータを生成できます。
出力例
A B C D E F Random Mapped Sum_A_B Conditional_Sum Shifted Diff
0 1 4 5 Low 1-4 4 62 One 5 0 NaN NaN
1 2 5 7 Low 2-5 10 91 Two 7 7 1.0 1.0
2 3 6 9 High 3-6 18 43 Three 9 9 2.0 1.0使い所
時系列データの分析や予測変数の生成に役立ちます。
9. データベース操作風の列生成
説明
SQLのような結合操作で新しい列を生成します。
other_df = pd.DataFrame({'Key': [1, 2, 3], 'Value': ['A', 'B', 'C']})
df = df.merge(other_df, left_on='A', right_on='Key', how='left')
print(df)解説mergeメソッドを使うことで、別のDataFrameの情報を結合し、新しい列を生成します。この例では、Keyを基にValue列を追加しています。
出力例
A B C D E F Random Mapped Sum_A_B Conditional_Sum Shifted Diff Key Value
0 1 4 5 Low 1-4 4 62 One 5 0 NaN NaN 1 A
1 2 5 7 Low 2-5 10 91 Two 7 7 1.0 1.0 2 B
2 3 6 9 High 3-6 18 43 Three 9 9 2.0 1.0 3 C使い所
複数のデータソースを統合したい場合に非常に便利です。
10. ループを使った複雑な列の生成
説明
複雑なルールや条件を含む新しい列を生成する際、ループを使う方法です。
# 条件に応じて新しい列を作成
new_column = []
for i in range(len(df)):
if df.loc[i, 'A'] > 2:
new_column.append('High')
else:
new_column.append('Low')
df['Complex_Loop'] = new_column
print(df)解説forループとlocメソッドを使って行ごとに条件をチェックし、結果をリストとして作成します。その後、リストをDataFrameの新しい列に追加します。
出力例
A B C D E F Complex_Loop
0 1 4 5 Low 1-4 4 Low
1 2 5 7 Low 2-5 10 Low
2 3 6 9 High 3-6 18 High使い所
条件が複雑でベクトル演算が適用できない場合に有効です。ただし、データが多い場合、処理速度に注意が必要です。
11. 列の行方向演算を使用
説明
行単位でデータを操作する方法です。applyメソッドを使うことで複雑なロジックを一行ずつ適用できます。
# 行ごとに最大値を計算
df['Row_Max'] = df[['A', 'B', 'C']].apply(max, axis=1)
print(df)解説applyメソッドとaxis=1を指定することで、行方向に関数を適用できます。この例では、A、B、Cの各行の最大値を計算して新しい列に追加しています。
出力例
A B C D E F Row_Max
0 1 4 5 Low 1-4 4 5
1 2 5 7 Low 2-5 10 7
2 3 6 9 High 3-6 18 9使い所
行単位で集計や変換が必要な場合に便利です。
12. 他の列に依存する複雑な操作
説明
他の列の値に基づいて新しい列を生成する場合、applyメソッドを活用します。
# 他の列の値を使用して計算
def custom_function(row):
if row['A'] > 1 and row['B'] < 6:
return row['A'] * row['B']
else:
return 0
df['Dependent'] = df.apply(custom_function, axis=1)
print(df)解説
このコードでは、applyとカスタム関数を組み合わせて複雑な条件を適用しています。Aが1より大きく、Bが6未満の場合に限り、AとBを掛けた結果を新しい列として追加します。
出力例
A B C D E F Dependent
0 1 4 5 Low 1-4 4 0
1 2 5 7 Low 2-5 10 10
2 3 6 9 High 3-6 18 0使い所
複数の列に基づく複雑な操作や計算が必要な場合に有効です。
13. 列ごとの比較や統計値
説明
複数の列間での比較や統計値を使用して新しい列を生成する方法です。
# 列間で最大値を比較
df['Max_A_B'] = df[['A', 'B']].max(axis=1)
# 列の平均値を計算
df['Mean_A_B_C'] = df[['A', 'B', 'C']].mean(axis=1)
print(df)解説maxやmeanなどの集約関数を使用して列間の計算を行います。この例では、列AとBの最大値、およびA、B、Cの平均値をそれぞれ新しい列として追加しています。
出力例
A B C D E F Max_A_B Mean_A_B_C
0 1 4 5 Low 1-4 4 4 3.333333
1 2 5 7 Low 2-5 10 5 4.666667
2 3 6 9 High 3-6 18 6 6.000000使い所
列間の関係を把握するための計算や統計値の追加に便利です。
まとめ:各方法の使い所
| No. | 方法 | 主な使い所 |
|---|---|---|
| 1 | 計算による列の生成 | 数値計算や単純な変換を伴う処理 |
| 2 | 条件分岐による列の生成 | 条件付きのカテゴリやフラグ生成 |
| 3 | 列の組み合わせによる列の生成 | ラベルやカテゴリデータの作成 |
| 4 | 関数を使った列の生成 | 複雑なロジックを必要とする場合 |
| 5 | ランダム/外部データの列追加 | シミュレーションや外部データとの統合 |
| 6 | カテゴリデータのマッピング | 値の変換やカテゴリエンコード |
| 7 | 条件付き集約による列生成 | 条件に基づく部分集計 |
| 8 | シフトやラグを伴う列生成 | 時系列データの差分やラグ変数の作成 |
| 9 | データベース操作風の列生成 | 複数のデータソースの統合 |
| 10 | ループを使った複雑な列の生成 | 条件が複雑でベクトル演算が難しい場合 |
| 11 | 列の行方向演算を使用 | 行単位で集計や変換を行う場合 |
| 12 | 他の列に依存する複雑な操作 | 複数列に基づく柔軟な操作や計算を行いたい場合 |
| 13 | 列ごとの比較や統計値 | 列間の関係を計算したり統計値を付加したい場合 |
参考
以下は記事のまとめとして、参考になるWebサイトへのリンク一覧です。
Pandas公式ドキュメント
- Pandas User Guide (公式ドキュメント)
- URL: https://pandas.pydata.org/docs/
- 内容: Pandasのすべての機能について詳細に解説されています。
基本的な列生成に関する記事
- Creating and Modifying Columns in Pandas
- URL: https://realpython.com/pandas-add-column/
- 内容: 列の追加や変更に関する実践的な例が掲載されています。
条件付き列生成に関する記事
- Using NumPy’s
wherefor Conditional Logic in Pandas - URL: https://dataschool.com/python-pandas/conditional-column-creation/
- 内容: 条件付きの列生成や
numpy.whereの使い方について説明しています。
列の行方向演算に関する記事
- Pandas
applyMethod Explained - URL: https://towardsdatascience.com/apply-and-lambda-usage-in-pandas-b13a1ea037f7
- 内容:
applyメソッドを使った行方向の操作について具体例とともに解説されています。
他の列に依存する複雑な操作に関する記事
- Advanced Pandas: Custom Functions with
apply - URL: https://www.geeksforgeeks.org/apply-function-row-column-python-pandas/
- 内容: カスタム関数を使った複雑な列生成の例が豊富に掲載されています。
統計値や比較演算を使った列生成に関する記事
- Performing Aggregations in Pandas
- URL: https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html
- 内容: 列間の統計値や比較演算に関する詳細なドキュメント。
ランダムデータの生成や外部データの統合
- Pandas Random Sampling and External Merging
- URL: https://datagy.io/pandas-random-sample/
- 内容: ランダムデータの生成や外部データとの結合に関するテクニックを解説。
各リンクを参考にしながら、目的に応じた方法を選び、効率的なデータ操作を実践してください!


コメント