web-dev-qa-db-ja.com

pandas 2つの列をnull値と結合する

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
17
vagabond

一方の列で fillna を使用し、塗りつぶし値をもう一方の列にします。

df['foodstuff'].fillna(df['type'])

結果の出力:

0      Apple-martini
1          Apple-pie
2    strawberry-tart
3            dessert
4               None
33
root
  • 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
2
piRSquared

combine メソッドとlambdaを使用できます。

df['foodstuff'].combine(df['type'], lambda a, b: ((a or "") + (b or "")) or None, None)

(a or "") 戻り値 "" aがNoneの場合、同じロジックが連結に適用されます(連結が空の文字列の場合、結果はNoneになります)。

2
sirfz

新しい列の空の文字列には常に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
1
Vikash Singh