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