2017-08-02 84 views
2

我想根據查詢設置列的值。我大概可以使用.where來完成這個任務,但是.query的標準是我更容易維護的字符串,特別是當標準變得複雜時。基於df.query設置值?

import numpy as np 
import pandas as pd 

np.random.seed(51723) 
df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc')) 

我想提出一個新列,d和值設置爲1,其中符合這些標準:

criteria = '(a < b) & (b < c)' 

別的不說,我已經試過:

df['d'] = np.nan 
df.query(criteria).loc[:,'d'] = 1 

,但似乎什麼都不做,除了給SettingWithCopyWarning即使我使用.loc

又路過inplace這樣的:

df.query(criteria, inplace=True).loc[:,'d'] = 1 

給人AttributeError: 'NoneType' object has no attribute 'loc'

回答

3

AFAIK df.query()返回一個新的DF,所以請嘗試以下方法:

In [146]: df.loc[df.eval(criteria), 'd'] = 1 

In [147]: df 
Out[147]: 
      a   b   c d 
0 0.175155 0.221811 0.808175 1.0 
1 0.069033 0.484528 0.841618 1.0 
2 0.174685 0.648299 0.904037 1.0 
3 0.292404 0.423220 0.897146 1.0 
4 0.169869 0.395967 0.590083 1.0 
5 0.574394 0.804917 0.746797 NaN 
6 0.642173 0.252437 0.847172 NaN 
7 0.073629 0.821715 0.859776 1.0 
8 0.999789 0.833708 0.230418 NaN 
9 0.028163 0.666961 0.582713 NaN 
+1

我錯過了離開'FALSE'行空部分( - : – piRSquared

+0

今天我瞭解了'.eval'。這非常有用。謝謝。 – ChuHo

+0

@ChuHo,很高興我們可以幫助:) – MaxU