pandas - 在 DataFrame 的列中迭代和应用条件语句时无法获得正确的结果
问题描述
我有一个数据框框架,我需要在其中迭代其中一列并应用某些条件语句来使用一个或另一组方程。
我已经写了下面的代码。但是,我没有得到正确的结果。在代码中,会检查 input_data 变量的正值,但在遇到负值时不满足条件,并且始终将方程应用于正值的情况。
提前感谢您对此的任何建议
import pandas as pd
x=[-1,1]
y=[2,3]
df=pd.DataFrame({'x':x, 'y':y})
print(df)
x y
0 -1 2
1 1 3
input_data=df['x']
for i in range(len(input_data)):
if input_data[i]>0:
df['z']=input_data[i]+1
df['z2']=df['z']+1
df['z3']=1
else:
df['z']=input_data[i]-1
df['z2']=df['z']-1
df['z3']=0
print(df)
x y z z2 z3
0 -1 2 2 3 1
1 1 3 2 3 1
解决方案
在 pandas 中,循环通常通过以下方式实现apply()
:
df[['z','z2','z3']] = df.apply(
lambda row: [row.x+1, row.x+2, 1] if row.x > 0 else [row.x-1, row.x-2, 0],
result_type='expand',
axis=1)
# x y z z2 z3
# 0 -1 2 -2.0 -3.0 0.0
# 1 1 3 2.0 3.0 1.0
或者您可以使用矢量化np.where()
:
df['z'] = np.where(df.x > 0, df.x + 1, df.x - 1)
df['z2'] = np.where(df.x > 0, df.z + 1, df.z - 1)
df['z3'] = df.x.gt(0).astype(int)
# x y z z2 z3
# 0 -1 2 -2 -3 0
# 1 1 3 2 3 1
至于for
循环实现,问题是由于赋值语句造成的。
例如df['z3'] = 1
将整z3
列设置为1
(不仅仅是任何特定的行,z3
而是整列)。同样df['z3'] = 0
将整列设置为 0。这适用于所有这些赋值语句。
那么因为最后一个x
值是正的,所以最后的迭代将所有z
列设置为正结果。
推荐阅读
- javascript - 显示多个上传文件的音频文件持续时间?
- javascript - 新反应应用程序的页面响应错误,但过去创建的旧应用程序工作正常
- unity3d - unity 双面材质透明度
- git - 我在 GIT 分支中只有一个提交。如何删除那个提交?
- python-3.x - “模块'lambda_function'上缺少处理程序'lambda_handler'”,“errorType”:“Runtime.HandlerNotFound”[错误] NameError:名称's3_resource'未定义
- ignite - 除非将 DataStorageConfiguration 配置为持久化,否则 Ignite 胖客户端无法创建快照
- python - AWS Glue 将列值添加为另一个 DynamicFrame 中的列
- html - 使用 id 标签的链接隐藏 div 的标题内容
- azure - 注册自托管集成运行时。找不到路径hklm
- apache-flink - 如何使用 Table 或 SQL api 处理 kafka 源中的水印空闲?