4

TrueとFalseの値で満たされたデータフレームがあり、Trueを1に置き換え、Falseをnp.NaNに置き換えたデータフレームを取得したいと思います。dataframe.replaceを使用してみましたが、すべてTrueで満たされたデータフレームが得られました。forループを使用せずにそれを行う方法はありますか?

たとえば、これは私が持っているデータフレームであり、TrueはT、FalseはFです(文字列「T」と「F」ではありません。申し訳ありませんが、wikiで適切な間隔のテーブルをフォーマットする方法を理解できませんでした)。

2008-01-02 16:00:00 TTF
2008-01-03 16:00:00 TTT
2008-01-04 16:00:00 TTF
2008-01-07 16:00:00 TTT
2008-01-08 16 :00:00 TTF

これは私がそれを変更したいものです:

2008-01-02 16:00:00 1 1 np.NaN
2008-01-03 16:00:00 1 1 1
2008-01-04 16:00:00 1 1 np.NaN
2008-01-07 16: 00:00 1 1 1
2008-01-08 16:00:00 1 1 np.NaN

これらは、TrueとFalseを置き換えようとした行であり、すべてのTrue値で満たされたデータフレームを取得しました。

df.replace(to_replace=True, value=1, inplace=True, method=None)   
df.replace(to_replace=False, value=np.NAN, inplace=True, method=None)  

個別に試してみると、最初の行だけでは何も変わりません。2行目は、すべての値をTrueに変換します。

4

2 に答える 2

9

applymap()のすべての要素に関数を適用するために使用できますdataframe

In [1]: df = DataFrame([[True, True, False],[False, False, True]]).T

In [2]: df
Out[2]:
       0      1
0   True  False
1   True  False
2  False   True

In [3]: df.applymap(lambda x: 1 if x else np.nan)
Out[3]:
    0   1
0   1 NaN
1   1 NaN
2 NaN   1

dict:を使用することもできます

In [4]: d = {True:1, False:np.nan}

In [5]: df.applymap(lambda x: d[x])
Out[5]:
    0   1
0   1 NaN
1   1 NaN
2 NaN   1

以下からDSMのコメントに対処します。OPを読み間違え、日時がインデックスであると想定しました。それがインデックスでない場合、これは私のために働きました:

In [6]: df.applymap(lambda x: d.get(x,x))
Out[6]:
    0   1                    2
0   1 NaN  2012-01-01 00:00:00
1 NaN   1  2012-01-01 00:00:00
于 2013-01-06T03:38:56.197 に答える
1

これを試して。whereデフォルトで最初の使用nanで見つからないエントリ(たとえば、=='T'でないもの)が削除され、2番目の使用で見つからないエントリが1に置き換えられるために機能します。

In [48]: df = pd.DataFrame([ 'T', 'T', 'T', 'F', 'F' ], columns=['value'],index=pd.date_range('20010101',periods=5))

In [49]: df
Out[49]: 
           value
2001-01-01     T
2001-01-02     T
2001-01-03     T
2001-01-04     F
2001-01-05     F

In [50]: df.where(df=='T').where(df!='T',1)
Out[50]: 
           value
2001-01-01     1
2001-01-02     1
2001-01-03     1
2001-01-04   NaN
2001-01-05   NaN
于 2013-01-06T16:43:29.560 に答える