13

NA私は実験からいくつかのデータを持っており、各試行内には、試行全体に入力したい 's で囲まれたいくつかの単一の値があります。

df = pd.DataFrame({'trial': [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3], 
    'cs_name': [np.nan, 'A1', np.nan, np.nan, np.nan, np.nan, 'B2', 
                np.nan, 'A1', np.nan, np.nan, np.nan]})
Out[177]: 
   cs_name  trial
0      NaN      1
1       A1      1
2      NaN      1
3      NaN      1
4      NaN      2
5      NaN      2
6       B2      2
7      NaN      2
8       A1      3
9      NaN      3
10     NaN      3
11     NaN      3

bfill()と の両方を使用して、トライアル全体でこれらの値を埋めることができますがffill()、これを達成するためのより良い方法があるかどうか疑問に思っています。

df['cs_name'] = df.groupby('trial')['cs_name'].ffill()
df['cs_name'] = df.groupby('trial')['cs_name'].bfill()

期待される出力:

   cs_name  trial
0       A1      1
1       A1      1
2       A1      1
3       A1      1
4       B2      2
5       B2      2
6       B2      2
7       B2      2
8       A1      3
9       A1      3
10      A1      3
11      A1      3
4

2 に答える 2

15

別のアプローチは、次を使用することfirst_valid_indexですtransform

In [11]: g = df.groupby('trial')

In [12]: g['cs_name'].transform(lambda s: s.loc[s.first_valid_index()])
Out[12]: 
0     A1
1     A1
2     A1
3     A1
4     B2
5     B2
6     B2
7     B2
8     A1
9     A1
10    A1
11    A1
Name: cs_name, dtype: object

これは、ffill の後に bfill を使用するよりも効率的であるはずです...

cs_nameこれを使用して列を変更します。

df['cs_name'] = g['cs_name'].transform(lambda s: s.loc[s.first_valid_index()])

注: pandas で最初の null 以外のオブジェクトを取得するメソッドがあると便利だと思います。numpy ではopen requestです。現在メソッドはないと思います (間違っている可能性があります!)。 ..

于 2013-08-16T11:50:15.027 に答える
5

一部のグループに NaN のみが含まれている場合に表示されるエラーを回避したい場合は、次のようにします (trial=1 を持つグループには Nan のみがあるように df を変更したことに注意してください)。

df = pd.DataFrame({'trial': [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,1,1], 
'cs_name': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 'B2', np.nan, 
'A3', np.nan, np.nan, np.nan, np.nan,np.nan]})

g = data.groupby('trial')

g['cs_name'].transform(lambda s: 'No values to aggregate' if 
    pd.isnull(s).all() == True else s.loc[s.first_valid_index()])

df['cs_name'] = g['cs_name'].transform(lambda s: 'No values to aggregate' if 
    pd.isnull(s).all() == True else s.loc[s.first_valid_index()])`

このようにして、プログラムが特定のグループのすべての NaN を検出したときに、エラーの代わりに「集計する値がありません」(または任意の値) を入力します。

お役に立てれば :)

フェデリコ

于 2017-11-21T16:10:39.660 に答える