如何基于列Y

时间:2018-12-29 19:51:10

标签: python pandas

我正在使用Python Pandas修改csv文件。我对此很陌生,并且正在尝试将Pandas用作Excel的数据处理和操纵的替代方法。

现在,我遇到了一个问题,即试图根据列df.duration中同一行上单元格的值有条件地更改列df.paymenttype中单元格的值。

因此,我尝试使用.loc方法修改df.duration中的值。

df.loc[df.paymenttype == 'cash', df.duration] = (df.duration % 1)

它给出了预期的结果并且运行良好。但是,在这种情况下,df.duration % 1的结果对于某些行将返回不想要的值0.0。从数学上讲是正确的,但是如果df.duration % 1返回0.0,我想将df.duration的值设置为1。

所以我想我也许可以做这样的事情:

df.loc[df.paymenttype == 'cash', df.duration] = 1 if df.duration % 1 == 0 else (df.duration % 1)

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

现在我想知道两件事:

  1. 为什么会引发此ValueError,我该如何解决?

在将这个问题放到这里之前,我本可以并且应该对此做更多的研究,我会的。但更重要的是,对于未来的项目(因为我对Python和Pandas还是很陌生):

  1. 我现在想知道.loc方法是否是通常有条件地更改列单元格的值的正确方法,并且在这种情况下,我想在设置值时添加条件语句。

2 个答案:

答案 0 :(得分:1)

使用.loc进行的初始广播没有任何问题;它工作得很好。但是,如果情况开始变得更加复杂,您可能需要看看pd.where()np.select()

另请参阅Pandas conditional creation of a series/dataframe column

关于您眼前的问题:为什么不使用df['duration'].replace(0.0, 1)

答案 1 :(得分:1)

我建议您使用数据框.apply方法。就您而言:

def my_func(x):
    if x%1 == 0:
        return 1.0
    else:
        return x%1

df['duration'][df['paymenttype']=='cash'] = df['duration'][df['paymenttype']=='cash'].apply(my_func)

还有一个建议是使用df['column_name']而不是df.column_name。因为有时列名中可能会有空格。

祝你学习熊猫好运!