基本的Python查询

时间:2017-03-03 10:04:31

标签: python pandas

任何人都可以帮我解决下面的语法吗?

我有一个pandas.DataFrame df,想要执行:

if (df['Contract_Stage'] == "Stage 1"):
  df['DaysToContractEnd'].fillna(600, inplace=True)
elif(df['Contract_Stage']=="Stage 2"):
  df['DaysToContractEnd'].fillna(350, inplace=True)
elif(df['Contract_Stage']=="Stage 3"):
  df['DaysToContractEnd'].fillna(150, inplace=True)
elif(df['Contract_Stage']=="Stage 4"):
  df['DaysToContractEnd'].fillna(-30, inplace=True)

错误:

File "<ipython-input-27-140b902fd3f8>", line 1, in <module>
if (df['Contract_Stage'] == "Stage 1"):

File "C:\Program Files\Anaconda3\lib\site-packages\pandas\core\generic.py", line 892, in __nonzero__
.format(self.__class__.__name__))

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

1 个答案:

答案 0 :(得分:2)

df['Contract_Stage'] == "Stage 1"将输出TrueFalse的向量,其形状为(df.shape [0],1)。

因此,当您执行if df['Contract_Stage'] == "Stage 1"时,无法将其评估为TrueFalse

你能做的是:

stage1 = df.loc[df['Contract_Stage'] == "Stage 1",'DaysToContractEnd']
stage1.fillna(600, inplace=True)
df.loc[df['Contract_Stage'] == "Stage 1",'DaysToContractEnd'] = stage1

这意味着:

  • 条件'DaysToContractEnd'df['Contract_Stage'] == "Stage 1"的所有行都会显示列True,并将其分配给临时变量stage1
  • stage1中,您使用600填写na。
  • 您将所有行替换为'DaysToContractEnd'df['Contract_Stage'] == "Stage 1"条件Truestage1