2017-06-15 17 views
1

Np.whereは私に多くのエラーを与えているので、代わりにdf.locで解決策を探しています。python:複数の条件を持つpandas np.whereとdf.loc

これは私が取得されていますnp.whereエラーです:

C:\Users\xxx\AppData\Local\Continuum\Anaconda2\lib\site-packages\ipykernel\__main__.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    if __name__ == '__main__': 

私は、次のデータフレームDFで働いています:

df = pd.DataFrame({'Column_A': ['AAA','AAA','ABC','CDE'],'checked': ['0','0','1','0'],'duplicate': ['True','True','False','False']}) 

    Column_A checked duplicate 
0 AAA    0  True 
1 AAA    0  True 
2 ABC    1  False 
3 CDE    0  False 

チェックすると、私は、追加のフラグを作成したいれます0と重複は真です。

私はこれを試してみましたが、それはうまくいきませんでした:

df['flag'] = (np.where((df['checked'] == 'Y') &(df['duplicate'] == 'True'), 'Y', '0')) 

TypeError: invalid type comparison 

私はdf.locでそれを試してみました:

df['flag'] = (df.loc[df['checked'] == 'Y']& df.loc[df['duplicate'] == 'True'], 'Y','0') 

TypeError: invalid type comparison 

と私は同じエラーを取得します!

私はあなたの booleanstringのではありませんので、 'を取り外す必要があると思う

答えて

3

df = pd.DataFrame({'Column_A': ['AAA','AAA','ABC','CDE'], 
        'checked': ['0','0','1','0'], 
        'duplicate': [True, True, False, False]}) 

df['flag'] = np.where((df['checked'] == 'Y') &(df['duplicate'] == True), 'Y', '0') 
print (df) 
    Column_A checked duplicate flag 
0  AAA  0  True 0 
1  AAA  0  True 0 
2  ABC  1  False 0 
3  CDE  0  False 0 

場合やboolean列、== Trueは属性を省略してもかまいませとの比較:checked必要性を確認する必要がある場合にも

df['flag'] = np.where((df['checked'] == 'Y') &(df['duplicate']), 'Y', '0') 
print (df) 
    Column_A checked duplicate flag 
0  AAA  0  True 0 
1  AAA  0  True 0 
2  ABC  1  False 0 
3  CDE  0  False 0 

'strings

df['flag'] = np.where((df['checked'] == '0') &(df['duplicate'] == True), 'Y', '0') 
print (df) 
    Column_A checked duplicate flag 
0  AAA  0  True Y 
1  AAA  0  True Y 
2  ABC  1  False 0 
3  CDE  0  False 0 

EDIT:loc

ソリューション:

df['flag'] = '0' 
mask = (df['checked'] == '0') &(df['duplicate']) 
df.loc[mask, 'flag'] = 'Y' 
print (df) 
    Column_A checked duplicate flag 
0  AAA  0  True Y 
1  AAA  0  True Y 
2  ABC  1  False 0 
3  CDE  0  False 0 
+0

ああ - 私は参照してください! &wの代わりにOR文を使う方法 – jeangelj

+0

ありがとうございます - df.locでそれを行う方法はありますか? – jeangelj

+0

私はそう思います、それはあなたが必要とするものによって異なります。 '&'はビット単位で 'and'で、' | 'はビット単位で' or'です。 – jezrael

関連する問題