2016-08-16 14 views
5

私はちょっと違う名前の個別のcsvファイルであったかなり面倒なデータセットを扱っています。 csvファイルの列の名前を変更するのはあまりにも厄介です。なぜなら、まだ私はすべてのバリエーションを発見しているからです。特定の行の列に対して、NaNではなく、新しい列に追加します。それを行う方法はありますか?パンダ:NaNでないカラムを取る

ケースインポイントです。のは、私はこのようになり、データフレームを持っているとしましょう:

Index A  B 
1  15 NaN 
2  NaN 11 
3  NaN 99 
4  NaN NaN 
5  12 14 

これは私のデータフレームは、次のようになりますように新しい列Cを作成することですからの私の所望の出力を言ってみましょう:

Index A  B  C 
1  15 NaN  15 
2  NaN 11  11 
3  NaN 99  99 
4  NaN NaN  NaN 
5  12 14  12 (so giving priority to A over B) 

どうすればいいですか?

+0

[ 'pd.DataFrame.update'(http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.update.html) – Kartik

答えて

5

:これは、NULL値を無視します、しかし、あなたが欲しい「欄prececence」を失うことになる。以上の2つの列を持っている、maxまたはminを使用する方が簡単かもしれませんコルのMNS、あなたが行(.bfill(axis=1))を埋めるバックアップおよび最初の列(.iloc[:, 0])を取ることができます。

df = pd.DataFrame({ 
    'A': [15, None, None, None, 12], 
    'B': [None, 11, 99, None, 14], 
    'C': [10, None, 10, 10, 10]}) 

df['D'] = df.bfill(axis=1).iloc[:, 0] 

>>> df 
    A B C D 
0 15 NaN 10 15 
1 NaN 11 NaN 11 
2 NaN 99 10 99 
3 NaN NaN 10 10 
4 12 14 10 12 
3

あなただけの2列を持っている場合は、クリーンな方法はwhereを使用することです(構文はwhere([condition], [value if condition is true], [value if condition is false])である(何らかの理由で、それはこのまわりで私の頭をラップするために私にしばらく時間がかかった)。

In [2]: df.A.where(df.A.notnull(),df.B) 
Out[2]: 
0 15.0 
1 11.0 
2 99.0 
3  NaN 
4 12.0 
Name: A, dtype: float64 

あなたの場合任意の数のデータフレームのために

In [3]: df.max(axis=1) 
Out[3]: 
0 15.0 
1 11.0 
2 99.0 
3  NaN 
4 14.0 
dtype: float64 
0

それとも、列を優先し 'df.apply' を使用することができますA.

def func1(row): 
    A=row['A'] 
    B=row['B'] 
    if A==float('nan'): 
     if B==float('nan'): 
      y=float('nan') 
     else: 
      y=B 
    else: 
     y=A 
    return y 
df['C']=df.apply(func1,axis=1) 
1

これを試してみてください:

01(このメソッドは、列の順序に依存することなく、列を優先するflexiblityすることができます。)

@アレキサンダー設定を使用する。

df["D"] = df["B"] 
df["D"] = df['D'].fillna(df['A'].fillna(df['B'].fillna(df['C']))) 

     A  B  C  D 
0 15.0 NaN 10.0 15.0 
1 NaN 11.0 NaN 11.0 
2 NaN 99.0 10.0 99.0 
3 NaN NaN 10.0 10.0 
4 12.0 14.0 10.0 14.0 
関連する問題