LoginSignup
1
2

More than 1 year has passed since last update.

DataFrameのリスト要素をNaNが含まれていても結合する方法

Posted at

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"

解決方法

下記のステップで実装します。

  1. NaNを空文字に置換する
  2. すべての要素をリストに変換する。空文字が空リストに変換される。
  3. 列方向にリストを結合する
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]

参考

1
2
0

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
1
2