LoginSignup
27
17

More than 1 year has passed since last update.

【Python3】pandas.DataFrameのカラム重複削除

Last updated at Posted at 2019-06-27

pandasのDataFrameを操作しているときに,カラム重複を削除したいときがあったのでまとめておきます

まず,こんなテーブルがあったとする

import pandas as pd
df = pd.DataFrame([
    [1, 11, 1, 3],
    [2, 12, 2, 4],
    [3, 13, 3, 5]
], columns = ["a", "a", "c", "d"])
df

↓↓↓↓↓↓↓↓↓↓

a a c d
1 11 1 3
2 12 2 4
3 13 3 5

カラム名の重複を削除したいとき

カラムの中身の値が違くても,とりあえず同じカラム名だったらindex番号が若い方(左にあるカラム)を優先させたいとき

#重複してないカラム名のみ選択
df.loc[:,~df.columns.duplicated()]

↓↓↓↓↓↓↓↓↓↓

a c d
1 1 3
2 2 4
3 3 5
df.loc[:,~df.columns.duplicated(keep = "last")]

とすれば最後のaカラムが採用されます

pandas.DataFrame.duplicatedメソッドのDoc

カラムの要素の重複を削除したいとき

#転置してから重複行を削除し,再度転置して元に戻す
df.T.drop_duplicates().T 

↓↓↓↓↓↓↓↓↓↓

a a d
1 11 3
2 12 4
3 13 5

pandas.DataFrame.drop_duplicatesメソッドのDoc

~追記~

カラム名重複のあるデータフレームを,カラムの欠損を保管し合う+重複削除したいとき


def agg_dup_col(df_: pd.core.frame.DataFrame) -> pd.core.frame.DataFrame:
    '''カラム名重複のあるデータフレームを,カラムの欠損を保管し合う+重複削除し,データフレームとして返す
    Args:
        df_ (pd.core.frame.DataFrame): any dataframe
    Returns:
        pd.core.frame.DataFrame
    '''
    df = df_.copy()
    dup_col = set(df.columns[df.columns.duplicated()])
    for col in dup_col:
        value = [[v for v in values if v == v and v is not None]
                 for values in df[col].values.tolist()]
        value = [v[0] if v != [] else None for v in value]
        df = df.drop(col, axis=1)
        df[col] = value
    return df
27
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
17