Pandas DataFrame で NaN 値を持つ列を削除する方法は 2 つあります。
(1)少なくとも1つのNaNを含む列を削除します。
df.dropna(axis='columns', inplace=True)
(2)すべての値がNaNである列を削除します。
df.dropna(axis='columns', how='all', inplace=True)
例
デモンストレーションのために、次の 5 つの列を持つ DataFrame を作成しましょう。
- 3つの列にはNaN値が含まれます
- 2列にはNaN値は含まれません
DataFrame を作成する構文は次のとおりです。
import pandas as pd
import numpy as np
data = {'Column_A': [1, 2, 3, 4, 5, np.nan, 6, 7, np.nan],
'Column_B': [11, 22, 33, 44, 55, 66, 77, 88, 99],
'Column_C': ['a', 'b', np.nan, np.nan, 'c', 'd', 'e', np.nan, 'f'],
'Column_D': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii'],
'Column_E': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
}
df = pd.DataFrame(data)
print(df)
ご覧のとおり、3 つの列 (「Column_A」、「Column_C」、「Column_E」) には NaN 値が含まれています。

最終的な目標は、上記の DataFrame 内の NaN 値を持つ列を削除することです。
(1)少なくとも1つのNaNを含む列を削除する
次のテンプレートを使用して、少なくとも 1 つの NaN を含む列を削除できます。
df.dropna(axis='columns', inplace=True)
私たちの例:
import pandas as pd
import numpy as np
data = {'Column_A': [1, 2, 3, 4, 5, np.nan, 6, 7, np.nan],
'Column_B': [11, 22, 33, 44, 55, 66, 77, 88, 99],
'Column_C': ['a', 'b', np.nan, np.nan, 'c', 'd', 'e', np.nan, 'f'],
'Column_D': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii'],
'Column_E': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
}
df = pd.DataFrame(data)
df.dropna(axis='columns', inplace=True)
print(df)
コードを実行すると、元々NaN値を含んでいた3つの列が削除されていることがわかります。NaN値を含まない残りの2つの列のみが保持されています。

(2)すべての値がNaNである列を削除する
すべての値が NaN である列だけを削除したい場合はどうすればよいでしょうか?
その場合、以下のテンプレートを使用してこの目標を達成できます。
df.dropna(axis='columns', how='all', inplace=True)
使用できるコードは次のとおりです。
import pandas as pd
import numpy as np
data = {'Column_A': [1, 2, 3, 4, 5, np.nan, 6, 7, np.nan],
'Column_B': [11, 22, 33, 44, 55, 66, 77, 88, 99],
'Column_C': ['a', 'b', np.nan, np.nan, 'c', 'd', 'e', np.nan, 'f'],
'Column_D': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii'],
'Column_E': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]
}
df = pd.DataFrame(data)
df.dropna(axis='columns', how='all', inplace=True)
print(df)
お気づきかもしれませんが、「Column_E」(NaN 値のみを含む)は削除されました。
