【Pandas】複数の列を元に新しい列を生成する方法13選

Pandas
この記事は約14分で読めます。

こんにちは、JS2IIUです。

Pandasは、データ分析や前処理の分野で非常に強力なPythonライブラリです。データを操作する中で、複数の列を基に新しい列を生成する必要が出てくる場面は多いです。本記事では、Pandasを使った新しい列の生成方法を13種類に分けて解説します。それぞれの方法にサンプルコードと解説を添えていますので、ぜひ参考にしてください。

1. 計算による新しい列の生成

説明
列の値を直接加減乗除することで、新しい列を作成します。

Python
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)

解説
このコードでは、列ABの各値を足し合わせて新しい列Cを作成しています。数値計算は、通常のPython演算子で記述可能です。+, -, *, /のような演算子を使用できます。

出力例

Plaintext
   A  B  C
0  1  4  5
1  2  5  7
2  3  6  9

参考リンク

2. 条件分岐による新しい列の生成

説明
条件を使って新しい列を作成します。条件分岐にはnp.whereapplyを使う方法があります。

Python
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に格納されます。

出力例

Plaintext
   A  B  C     D
0  1  4  5   Low
1  2  5  7   Low
2  3  6  9  High

参考リンク

3. 列の組み合わせによる新しい列の生成

説明
複数の列の値を結合して新しい列を作成します。

Python
df['E'] = df['A'].astype(str) + '-' + df['B'].astype(str)  # AとBを文字列として結合
print(df)

解説
数値型の列を文字列型に変換するには.astype(str)を使います。その後、文字列の+演算子で結合しています。この方法は、ラベル付けやカテゴリデータの生成に便利です。

出力例

Plaintext
   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メソッドを使って、カスタム関数で新しい列を生成します。

Python
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と指定すると、行ごとの操作を行います。ここでは、各行のABの積を計算しています。

出力例

Plaintext
   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. ランダムデータや外部データを使った列の生成

説明
ランダムな値や外部データを新しい列として追加する方法です。

Python
import numpy as np

# ランダムな値を新しい列に追加
df['Random'] = np.random.randint(0, 100, size=len(df))
print(df)

解説
このコードでは、NumPyのrandom.randintを使用して0~99のランダムな整数を生成し、新しい列RandomとしてDataFrameに追加しています。外部データを読み込む場合も、類似の方法で列を追加できます。

出力例

Plaintext
   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. カテゴリデータのマッピング

説明
既存の列に基づいてカテゴリをマッピングする方法です。

Python
mapping = {1: 'One', 2: 'Two', 3: 'Three'}
df['Mapped'] = df['A'].map(mapping)
print(df)

解説
mapメソッドは辞書型データを受け取り、対応する値を新しい列として追加します。この例では、列Aの値をmapping辞書に基づいて文字列に変換しています。

出力例

Plaintext
   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. 条件付き集約を伴う列の生成

説明
条件付きで集約値を新しい列として生成します。

Python
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の値を保持しています。

出力例

Plaintext
   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. シフトやラグを伴う列生成

説明
前後のデータを使用して新しい列を生成します。

Python
df['Shifted'] = df['A'].shift(1)  # 1つ前の値
df['Diff'] = df['A'] - df['A'].shift(1)  # 差分
print(df)

解説
shiftメソッドは行をシフトさせる操作を行います。これにより、時系列データの差分やラグデータを生成できます。

出力例

Plaintext
   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のような結合操作で新しい列を生成します。

Python
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列を追加しています。

出力例

Plaintext
   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. ループを使った複雑な列の生成

説明
複雑なルールや条件を含む新しい列を生成する際、ループを使う方法です。

Python
# 条件に応じて新しい列を作成
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の新しい列に追加します。

出力例

Plaintext
   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メソッドを使うことで複雑なロジックを一行ずつ適用できます。

Python
# 行ごとに最大値を計算
df['Row_Max'] = df[['A', 'B', 'C']].apply(max, axis=1)
print(df)

解説
applyメソッドとaxis=1を指定することで、行方向に関数を適用できます。この例では、ABCの各行の最大値を計算して新しい列に追加しています。

出力例

Plaintext
   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メソッドを活用します。

Python
# 他の列の値を使用して計算
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未満の場合に限り、ABを掛けた結果を新しい列として追加します。

出力例

Plaintext
   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. 列ごとの比較や統計値

説明
複数の列間での比較や統計値を使用して新しい列を生成する方法です。

Python
# 列間で最大値を比較
df['Max_A_B'] = df[['A', 'B']].max(axis=1)

# 列の平均値を計算
df['Mean_A_B_C'] = df[['A', 'B', 'C']].mean(axis=1)
print(df)

解説
maxmeanなどの集約関数を使用して列間の計算を行います。この例では、列ABの最大値、およびABCの平均値をそれぞれ新しい列として追加しています。

出力例

Plaintext
   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のすべての機能について詳細に解説されています。

基本的な列生成に関する記事

条件付き列生成に関する記事

列の行方向演算に関する記事

他の列に依存する複雑な操作に関する記事

統計値や比較演算を使った列生成に関する記事

ランダムデータの生成や外部データの統合

  • Pandas Random Sampling and External Merging
  • URL: https://datagy.io/pandas-random-sample/
  • 内容: ランダムデータの生成や外部データとの結合に関するテクニックを解説。

各リンクを参考にしながら、目的に応じた方法を選び、効率的なデータ操作を実践してください!

コメント

タイトルとURLをコピーしました