2017-03-27 6 views
1

pythonで名前付きタプルを埋め込む方法はありますか?名前付きタプルまたはその他のクラスのパンダを持つfillna

私はこのTypeErrorを取得しています:任意の回避策

df.replace(np.nan, q) 
Traceback (most recent call last): 
    File "C:\Anaconda2\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-31-6f8a86f11bbb>", line 1, in <module> 
    df.replace(np.nan, q) 
    File "C:\Anaconda2\lib\site-packages\pandas\core\generic.py", line 3440, in replace 
    raise TypeError(msg) # pragma: no cover 
TypeError: Invalid "to_replace" type: 'float' 

from collections import namedtuple 
import pandas as pd 
import numpy as np 

df = pd.DataFrame([0, 0, 0, 0, np.nan, 0, 0, 0]) 

nametup = namedtuple('mynp', ['arg1', 'arg2']) 
q = nametup(None, None) 
df.fillna(q) 

Traceback (most recent call last): 
    File "C:\Anaconda2\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-25-363ec560dd77>", line 9, in <module> 
    df.fillna(q) 
    File "C:\Anaconda2\lib\site-packages\pandas\core\frame.py", line 2762, in fillna 
    downcast=downcast, **kwargs) 
    File "C:\Anaconda2\lib\site-packages\pandas\core\generic.py", line 3101, in fillna 
    'you passed a "{0}"'.format(type(value).__name__)) 
TypeError: "value" parameter must be a scalar or dict, but you passed a "mynp" 

もこれを試してみましたか?ありがとう!

+0

警告として、スカラーでないエントリは実際にはパンダによってサポートされていないので、予期せぬバグの危険があります。時にはこれにもかかわらず便利ですが、私は実際に過去にいくつかに噛まれました。 – DSM

+0

@DSMは洞察力に感謝して、別のアプローチを使用できるかどうかを見ていきます。あなたがパンダを使用するための日付でクラスを持っているときにはとても便利です。興味深いアプローチのおかげで –

答えて

2

それは容易ではありませんが、オブジェクトによってSeriesを作成し、NaNを交換する必要があります。mask

nametup = namedtuple('mynp', ['arg1', 'arg2']) 
q = nametup(None, None) 

s = pd.Series([q]*len(df.index)) 
print (s) 
0 (None, None) 
1 (None, None) 
2 (None, None) 
3 (None, None) 
4 (None, None) 
5 (None, None) 
6 (None, None) 
7 (None, None) 
dtype: object 

ソリューション:Seriessによってcombine_firstまたはfillna

df[0] = df[0].mask(df[0].isnull(), s) 
print (df) 
       0 
0    0 
1    0 
2    0 
3    0 
4 (None, None) 
5    0 
6    0 
7    0 

別の解決策:

df[0] = df[0].combine_first(s) 
#similar solution 
#df[0] = df[0].fillna(s) 
print (df) 
       0 
0    0 
1    0 
2    0 
3    0 
4 (None, None) 
5    0 
6    0 
7    0 
+0

! –

+0

Btw、このアプローチは、空リストに 'N​​aN'を置き換える必要がある場合に機能します – jezrael