使用条件语句替换pandas DataFrame中的条目

Jam*_*ves 4 python conditional pandas

我想在给定条件的情况下更改Dataframe中条目的值.例如:

d = pandas.read_csv('output.az.txt', names = varname)
d['uld'] = (d.trade - d.plg25)*(d.final - d.price25)

if d['uld'] > 0:
   d['uld'] = 1
else:
   d['uld'] = 0
Run Code Online (Sandbox Code Playgroud)

我不明白为什么以上不起作用.谢谢您的帮助.

EdC*_*ica 11

用于np.where根据简单的布尔条件设置数据:

In [3]:

df = pd.DataFrame({'uld':np.random.randn(10)})
df
Out[3]:
        uld
0  0.939662
1 -0.009132
2 -0.209096
3 -0.502926
4  0.587249
5  0.375806
6 -0.140995
7  0.002854
8 -0.875326
9  0.148876
In [4]:

df['uld'] = np.where(df['uld'] > 0, 1, 0)
df
Out[4]:
   uld
0    1
1    0
2    0
3    0
4    1
5    1
6    0
7    1
8    0
9    1
Run Code Online (Sandbox Code Playgroud)

至于为什么你做的失败了:

In [7]:

if df['uld'] > 0:
   df['uld'] = 1
else:
   df['uld'] = 0
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-ec7d7aaa1c28> in <module>()
----> 1 if df['uld'] > 0:
      2    df['uld'] = 1
      3 else:
      4    df['uld'] = 0

C:\WinPython-64bit-3.4.3.1\python-3.4.3.amd64\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
    696         raise ValueError("The truth value of a {0} is ambiguous. "
    697                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
--> 698                          .format(self.__class__.__name__))
    699 
    700     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
Run Code Online (Sandbox Code Playgroud)

所以错误是你试图用一个数组来评估True或者False变得模糊,因为有多个值要比较,因此错误.在这种情况下,你不能真正使用建议any,all等等,你是想掩盖你的DF和只设置在条件满足的价值观,对大熊猫网站关于此问题的解释:HTTP://大熊猫. pydata.org/pandas-docs/dev/gotchas.html及其相关问题:ValueError:具有多个元素的数组的真值是不明确的.使用a.any()或a.all()

np.where 将布尔条件作为第一个参数,如果为真,则返回第二个参数,否则返回第三个参数.

UPDATE

说完看了这个你可以再次布尔系列转换为int使用铸造astype:

In [23]:
df['uld'] = (df['uld'] > 0).astype(int)
df

Out[23]:
   uld
0    1
1    0
2    0
3    0
4    1
5    1
6    0
7    1
8    0
9    1
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢.我真的很惊讶我可以提出一个问题并得到如此详细的答案.多么棒的经历.再次感谢! (2认同)