DataFrameのリスト要素を結合するとき、要素の値としてNaN
が含まれていると、結果はNaN
になります。
期待通りに動かないコード
import pandas as pd
import numpy as np
df_test = pd.DataFrame({
"data1" :[["1","2","3"],["1","2","3"]],
"data2" :[["4","5","6"],["4","5","6"]],
"data3" :[["7","8","9"],np.nan]
})
result = df_test["data1"]+ df_test["data2"]+ df_test["data3"]
print(result)
# 結果
# 0 [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1 NaN ← [1, 2, 3, 4, 5, 6] としたい
単純にfillna()
を使ってNaN
を空リストに変換しようとすると、リストには変換できないと怒られてしまいます。
単純にfillna()を使ってもエラー
result = df_test["data1"]+ df_test["data2"]+ df_test["data3"].fillna([])
# TypeError: "value" parameter must be a scalar or dict, but you passed a "list"
解決方法
下記のステップで実装します。
-
NaN
を空文字に置換する - すべての要素をリストに変換する。空文字が空リストに変換される。
- 列方向にリストを結合する
import pandas as pd
import numpy as np
df_test = pd.DataFrame({
"data1" :[["1","2","3"],["1","2","3"]],
"data2" :[["4","5","6"],["4","5","6"]],
"data3" :[["7","8","9"],np.nan]
})
result = df_test.fillna("").applymap(list).sum(axis=1) # 変更点
print(result)
# 結果
# 0 [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1 [1, 2, 3, 4, 5, 6]
参考