python - Python & Pandas:结构化条件
问题描述
可能是一个菜鸟问题,但我是 Python 和 Pandas 的新手,还在学习语法。我正在开发一个脚本,我想在其中构建一个将单元格值乘以整个列的条件。
这是 的结构test.csv
:
如果单元格中的值大于 3,我想创建一个将单元格error_count_score
中的值乘以3 的列error_count
(作为 Excel 公式,它将是:)=IF(C2<=3,0,(C2*3))
。在这种情况下,新列的值是0
和12
。
我怀疑有多种方法可以解决这个问题,但我不确定如何构造代码。这是我的工作代码尝试:
import pandas as pd
df = pd.read_csv("test.csv")
df.loc[df['error_count'] >= 3, 'error_count_score'] = #do I put an object here? * 3
非常感谢任何帮助或建议。
解决方案
您可以创建一个函数,对 column 中的单个元素执行您想要的操作,然后将该函数应用于该列的每个元素,生成您的新列。
这是通过DataFrame.apply
方法完成的。
在你的情况下:
def my_function(element):
if element <= 3:
return 0
else:
return element * 3
df['error_count_score'] = df['error_count'].apply(my_function)
请注意,pandas 期望my_function
接受一个参数(列的每个元素),然后通过一些逻辑应用它,最后返回一个新元素。这正是这里发生的事情。
当你习惯了 pandas 时,你会发现很多时候人们不会费心去定义一个函数,只是为了应用它一次。在这些情况下,人们会使用一个匿名函数——基本上是一个只存在于一行的函数——使用lambda
关键字。
在你的情况下:
df['error_count_score'] = df['error_count'].apply(lambda element: 0 if element <= 3 else element * 3)
推荐阅读
- python - 如何建立连接以接收实时股票数据
- laravel - 如何让 Laravel Passport 上的多重身份验证工作?
- django - Django 错误:在 include() 的情况下,视图必须是可调用的或列表/元组
- xml - 是否可以在另一个中包含一个选择?
- pyspark - PySpark ApproxSimilarityJoin 缺失结果
- sql - 如何避免使用 MAX() 和 group by 在 Oracle 中接收来自同一 id 的多行?
- java - 如何将 Java 类映射到 Oracle 自定义类型以用作存储过程中的 IN 参数?
- android - 房间交易回滚或取消
- mysql - data import wizard mysql table exists but does not appear under 'use existing table'
- c++ - 如何报告异或为零的子数组的索引?