我正在使用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()
。
现在我想知道两件事:
在将这个问题放到这里之前,我本可以并且应该对此做更多的研究,我会的。但更重要的是,对于未来的项目(因为我对Python和Pandas还是很陌生):
.loc
方法是否是通常有条件地更改列单元格的值的正确方法,并且在这种情况下,我想在设置值时添加条件语句。答案 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
。因为有时列名中可能会有空格。
祝你学习熊猫好运!