我正在尝试定义一个函数,该函数将遍历数据框中现有列的每一行,并在满足某些条件时将其值写入同一行上的新列:
def priceinspection(row):
if row["trend"] = "stronguptrend" or "strongdowntrend" or "superuptrend" or "superdowntrend" or "hyperuptrend" or "hyperdowntrend":
val = row["Close"]
else:
val = " "
return val
但是 val= row["Close"]
导致语法错误。我应该如何修复代码,以便在满足我的条件时返回“关闭”列值?
答案 0 :(得分:1)
请根据条件进行布尔选择并使用 np.where(condition, val if condition, val if not condition)
。示例如下。
一些数据
import pandas as pd
df=pd.DataFrame({'trend':["stronguptrend" ,"strongdowntrend" ,"superuptrend", "superdowntrend" ,"hyperuptrend" , "hyperdowntrend"]})
print(df)
trend
0 stronguptrend
1 strongdowntrend
2 superuptrend
3 superdowntrend
4 hyperuptrend
5 hyperdowntrend
解决方案
import numpy as np
df['Close']=np.where(df['trend'].isin(["stronguptrend","strongdowntrend"]),'val',"")
print(df)
trend Close
0 stronguptrend val
1 strongdowntrend val
2 superuptrend
3 superdowntrend
4 hyperuptrend
5 hyperdowntrend
答案 1 :(得分:1)
这是我如何使用我创建的任意条件来做到这一点。如果 'stronguptrend
包含字符串 'Fail'
,则表会将 writestring
的值添加到新创建的“关闭”列中。
如果条件不满足则只打印表格。
df = pd.read_csv(".../ExcelFile.csv")
df_filter= df[['stronguptrend','strongdowntrend','superuptrend',"superdowntrend", "hyperuptrend", "hyperdowntrend"]]
if df_filter['stronguptrend'].str.contains('Fail').any():
for index,row in df_filter.iterrows():
writestring = ''
df_filter.at[index, 'Close'] = writestring
print(df_filter)
else:
print(df_filter)
答案 2 :(得分:1)
我意识到我犯了一个基本错误,我使用 = do 表示当 == 是 python 中使用的符号时。感谢 bnaecker 在问题评论中回答
答案 3 :(得分:0)
这是一个简单的方法。
def priceinspection(df):
new_column_list = []
for row in df[['trend']].values:
if row[0] == ("strongdowntrend" or "stronguptrend" or "superuptrend" or
"superdowntrend" or "hyperuptrend" or "hyperdowntrend"):
new_column_list.append("Close")
else:
new_column_list.append("")
df['new_column'] = new_column_list
return(df)