2017-08-06 8 views
1

データフレームでゼロ以外の値のログを取得し、0をNAに置き換えるにはどうすればよいですか。データフレーム内のゼロ以外の値だけのログを取り、OをNAに置き換えるにはどうすればよいですか?

私は以下のようなデータフレームを持っている:

 time     y1 y2 
0 2017-08-06 00:52:00 0 10 
1 2017-08-06 00:52:10 1 20 
2 2017-08-06 00:52:20 2 0 
3 2017-08-06 00:52:30 3 0 
4 2017-08-06 00:52:40 0 5 
5 2017-08-06 00:52:50 4 6 
6 2017-08-06 00:53:00 6 11 
7 2017-08-06 00:53:10 7 12 
8 2017-08-06 00:53:20 8 0 
9 2017-08-06 00:53:30 0 13 

私はすべての列のログを取りたいが、最初の列の時間とログを期待する唯一の非ゼロ値の計算もしてのをゼロにすべきであるNAのと交換すべきですか?私はこれをどのようにして行うのですか?助けてください

cols = df.columns.difference(['time']) 
# Replacing O's with NA's using below: 

df[cols] = df[cols].mask(np.isclose(df[cols].values, 0), np.nan) 

df[cols] = np.log(df[cols]) # but this will try take log of NA's also. 

だから、私はこのような何かをしようとしました。

出力は同じ時間列のデータフレームでなければならず、すべてのゼロはNAで置き換えられ、残りのすべての値のログには1列目の値が必要です。

+0

出力として期待しているものを追加できますか? –

答えて

1

私が正しく理解している場合は、np.nanでゼロを置き換えてから、np.logと直接呼び出すことができます。NaNの値は無視されます。

np.log(df[['y1', 'y2']].replace(0, np.nan)) 

df.apply(np.log)を用い

>>> df = pd.DataFrame({'time': pd.date_range('20170101', '20170110'), 
         'y1' : np.random.randint(0, 3, 10), 
         'y2': np.random.randint(0, 3, 10)}) 

>>> df 
     time y1 y2 
0 2017-01-01 1 2 
1 2017-01-02 0 1 
2 2017-01-03 2 0 
3 2017-01-04 0 1 
4 2017-01-05 1 0 
5 2017-01-06 1 1 
6 2017-01-07 2 0 
7 2017-01-08 1 0 
8 2017-01-09 0 1 
9 2017-01-10 2 1 

>>> df[['log_y1', 'log_y2']] = np.log(df[['y1', 'y2']].replace(0, np.nan)) 

>>> df 
     time y1 y2 log_y1 log_y2 
0 2017-01-01 1 2 0.000000 0.693147 
1 2017-01-02 0 1  NaN 0.000000 
2 2017-01-03 2 0 0.693147  NaN 
3 2017-01-04 0 1  NaN 0.000000 
4 2017-01-05 1 0 0.000000  NaN 
5 2017-01-06 1 1 0.000000 0.000000 
6 2017-01-07 2 0 0.693147  NaN 
7 2017-01-08 1 0 0.000000  NaN 
8 2017-01-09 0 1  NaN 0.000000 
9 2017-01-10 2 1 0.693147 0.000000 
1

代替。 -infNaNに置き換えてdf.replaceを使用して置き換え、結果を元のものに連結することができます。

In [725]: pd.concat([df, df.iloc[:, 1:].apply(np.log).replace(-np.inf, np.nan).add_prefix('log_')], axis=1) 
Out[725]: 
        time y1 y2 log_y1 log_y2 
0 2017-08-06 00:52:00 0 10  NaN 2.302585 
1 2017-08-06 00:52:10 1 20 0.000000 2.995732 
2 2017-08-06 00:52:20 2 0 0.693147  NaN 
3 2017-08-06 00:52:30 3 0 1.098612  NaN 
4 2017-08-06 00:52:40 0 5  NaN 1.609438 
5 2017-08-06 00:52:50 4 6 1.386294 1.791759 
6 2017-08-06 00:53:00 6 11 1.791759 2.397895 
7 2017-08-06 00:53:10 7 12 1.945910 2.484907 
8 2017-08-06 00:53:20 8 0 2.079442  NaN 
9 2017-08-06 00:53:30 0 13  NaN 2.564949 
関連する問題