2列のdfがあり、NaN値を無視して両方の列を結合したい。キャッチは、両方の列にNaN値がある場合があります。その場合、新しい列にもNaNが必要です。以下に例を示します。
df = pd.DataFrame({'foodstuff':['Apple-martini', 'Apple-pie', None, None, None], 'type':[None, None, 'strawberry-tart', 'dessert', None]})
df
Out[10]:
foodstuff type
0 Apple-martini None
1 Apple-pie None
2 None strawberry-tart
3 None dessert
4 None None
私はfillna
を使用してこれを解決しようとしました:
df['foodstuff'].fillna('') + df['type'].fillna('')
そして私は得た:
0 Apple-martini
1 Apple-pie
2 strawberry-tart
3 dessert
4
dtype: object
行4は空白の値になっています。この状況で私が望まないのは、両方の結合列がNaNであるため、NaN値です。
0 Apple-martini
1 Apple-pie
2 strawberry-tart
3 dessert
4 None
dtype: object
一方の列で fillna
を使用し、塗りつぶし値をもう一方の列にします。
df['foodstuff'].fillna(df['type'])
結果の出力:
0 Apple-martini
1 Apple-pie
2 strawberry-tart
3 dessert
4 None
fillna
両方の列を一緒にsum(1)
はそれらを追加しますreplace('', np.nan)
df.fillna('').sum(1).replace('', np.nan)
0 Apple-martini
1 Apple-pie
2 strawberry-tart
3 dessert
4 NaN
dtype: object
combine
メソッドとlambda
を使用できます。
df['foodstuff'].combine(df['type'], lambda a, b: ((a or "") + (b or "")) or None, None)
(a or "")
戻り値 ""
aがNone
の場合、同じロジックが連結に適用されます(連結が空の文字列の場合、結果はNone
になります)。
新しい列の空の文字列には常にNoneを入力できます
import numpy as np
df['new_col'].replace(r'^\s*$', np.nan, regex=True, inplace=True)
完全なコード:
import pandas as pd
import numpy as np
df = pd.DataFrame({'foodstuff':['Apple-martini', 'Apple-pie', None, None, None], 'type':[None, None, 'strawberry-tart', 'dessert', None]})
df['new_col'] = df['foodstuff'].fillna('') + df['type'].fillna('')
df['new_col'].replace(r'^\s*$', np.nan, regex=True, inplace=True)
df
出力:
foodstuff type new_col
0 Apple-martini None Apple-martini
1 Apple-pie None Apple-pie
2 None strawberry-tart strawberry-tart
3 None dessert dessert
4 None None NaN