使用熊猫在多列中应用 IF 条件 [重复]

Posted

技术标签:

【中文标题】使用熊猫在多列中应用 IF 条件 [重复]【英文标题】:Applying an IF condition in multiple columns with pandas [duplicate] 【发布时间】:2021-11-19 02:57:21 【问题描述】:

我有一个如下的 ascii 文件(示例)

id lon lat val1 val2 val3
1 22 38 67 66 87 89 
2 23.5 39 56 10 90 98
3 22.5 38.5 34 45 56 78 

对于特定点(纬度、经度),我想将变量 val1、val2、val3 设置为零。 例如对于 lon=22, lat=38 和 lon=23.5,lat=39

我尝试了以下方法(仅用于 val1 修改),我得到了 ValueError: The truth value of a Series is ambiguous。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。 我怎么能做到这一点(也将所有变量 val 设置为 0)

import pandas as pd
col_names=['id','lon','lat','val1','val2','val3']
df = pd.read_csv(i,sep='\s+',names=col_names,header=None) 
df.loc[df['Lon'] ==22 and df['Lat'] ==38, 'val1'] = 0
    

【问题讨论】:

and 比较系列无效,需要位运算符& 【参考方案1】:

如果您有多个以val 开头的列要在一个步骤中处理,您可以使用.filter() 过滤列并将其设置为列表cols。然后,使用.loc设置选中的列,如下:

# put all columns that start with `val` into a list
cols = df.filter(regex='^val').columns

# set 0 all the variables val*
df.loc[(df['Lon'] == 22) & (df['Lat'] == 38), cols] = 0

【讨论】:

谢谢,如果我想乘以 cols 的一个因子怎么办?我必须使用 df.loc[(df['Lon'] == 22) & (df['Lat'] == 38), cols] = cols * factor 吗? @Nat 使用 df.loc[(df['Lon'] == 22) & (df['Lat'] == 38), cols] *= factor【参考方案2】:

尝试添加括号。

df.loc[(df['Lon'] ==22) & (df['Lat'] ==38), 'val1'] = 0

【讨论】:

【参考方案3】:

代替

df['Lon'] ==22 and df['Lat'] ==38

使用

(df['Lon'] ==22) & (df['Lat'] ==38)

【讨论】:

谢谢。但是,我如何将所有变量设置为零?例如val1,val2,val3?我必须对其他变量做同样的事情吗?还有其他简单的方法吗?由于原始文件有 24 个变量 在这种情况下我该如何使用 apply?

以上是关于使用熊猫在多列中应用 IF 条件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在多列熊猫上应用 lambda 行

如果在熊猫数据框中其他功能[重复]

根据熊猫中多列的条件(最大值)替换列中的值

在熊猫折线图中绘制多列[重复]

从熊猫列中的列表创建多列[重复]

如何在一项作业中向熊猫数据框添加多列?