2017-08-02 80 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