2

私は(昨日の時点で)新しい pandas ユーザーであり、便利でイライラすることもあります。

私の現在の不満は、データフレームの複数の列で df.fillna() を使用しようとすることです。たとえば、部分的に重複する 2 つのデータ セット (新しいセットと古いセット) があります。新しいデータがある場合はそのまま使いますが、新しいデータがなければ古いデータも使いたいです。fillna() を使用して新しい列を古い列で埋めることができるはずですが、それを機能させるのに問題があります。

特定の例を試してみましょう:

df.ix[:,['newcolumn1','newcolumn2']].fillna(df.ix[:,['oldcolumn1','oldcolumn2']], inplace=True)

しかし、これは期待どおりに機能しません - NaN だった新しい列には数値が表示されますが、古い列にあった数値は表示されません (実際、データを調べてみると、選択した数値がどこから来たのかわかりません)新しいデータにも古いデータにもどこにも存在しないため)。

DataFrame の特定の列の NaN を DataFrame の他の特定の列の値で埋める方法はありますか?

4

2 に答える 2

2

fillna一般に、観測を前後に運ぶためのものです。代わりに、私はnp.where...あなたが何を求めているのか理解できれば.

import numpy as np
np.where(np.isnan(df['newcolumn1']), df['oldcolumn1'], df['newcolumn1'])
于 2013-08-01T16:57:02.893 に答える
0

あなたの質問に答えるには:はい。valuefillnaの引数の使い方を見てください。to_dict()他のデータフレームのメソッドと一緒に。

しかし、あなたの問題を本当に解決するupdate()には、DataFrameのメソッドを見てください。あなたの2つのデータフレームが同様にインデックス化されていると仮定すると、それはまさにあなたが望むものだと思います.

In [36]: df = pd.DataFrame({'A': [0, np.nan, 2, 3, np.nan, 5], 'B': [1, 0, 1, np.nan, np.nan, 1]})

In [37]: df
Out[37]: 
    A   B
0   0   1
1 NaN   0
2   2   1
3   3 NaN
4 NaN NaN
5   5   1

In [38]: df2 = pd.DataFrame({'A': [0, np.nan, 2, 3, 4, 5], 'B': [1, 0, 1, 1, 0, 0]})

In [40]: df2
Out[40]: 
    A  B
0   0  1
1 NaN  0
2   2  1
3   3  1
4   4  0
5   5  0

In [52]: df.update(df2, overwrite=False)

In [53]: df
Out[53]: 
    A  B
0   0  1
1 NaN  0
2   2  1
3   3  1
4   4  0
5   5  1

も含まれていたため、 を除いて、 のすべての が置き換えられてNaNいることに注意してください。また、 のような値のいくつかはと の間で異なります。それを使用することで、 からの値を保持します。df(1, A)NaNdf2(5, B)dfdf2overwrite=Falsedf

編集:コメントに基づいて、列名が2つのDataFrameで一致しないソリューションを探しているようです(サンプルデータを投稿すると役立ちます)。列 A を C に、列 B を D に置き換えてみましょう。

In [33]: df = pd.DataFrame({'A': [0, np.nan, 2, 3, np.nan, 5], 'B': [1, 0, 1, np.nan, np.nan, 1]})

In [34]: df2 = pd.DataFrame({'C': [0, np.nan, 2, 3, 4, 5], 'D': [1, 0, 1, 1, 0, 0]})

In [35]: df
Out[35]: 
    A   B
0   0   1
1 NaN   0
2   2   1
3   3 NaN
4 NaN NaN
5   5   1

In [36]: df2
Out[36]: 
    C  D
0   0  1
1 NaN  0
2   2  1
3   3  1
4   4  0
5   5  0

In [37]: d = {'A': df2.C, 'B': df2.D}  # pass this values in fillna

In [38]: df
Out[38]: 
    A   B
0   0   1
1 NaN   0
2   2   1
3   3 NaN
4 NaN NaN
5   5   1

In [40]: df.fillna(value=d)
Out[40]: 
    A  B
0   0  1
1 NaN  0
2   2  1
3   3  1
4   4  0
5   5  1

パンダを学ぶために時間を投資すれば、フラストレーションを感じる瞬間が少なくなると思います。ただし、大規模なライブラリであるため、時間がかかります。

于 2013-08-01T17:01:31.190 に答える