这是我的问题
我有这个DataFrame:
df = pd.DataFrame({'Date':[1,2,3],
'Paul':[8,10,13],
'Mathieu':[18,20,2],
'Jacques':[2,1,70]})
df = df.set_index('Date')
我的目标是创建具有以下条件的IF语句: 如果滚动平均值2天的最后一个值<滚动平均值3天,并且第一个值(第1天)大于最后一个值(第3天),则打印列的名称。
这就是我开始的:
def test(data):
end = data.iloc[-1]
start = data.iloc[0]
end_rolling_2D = data.rolling(2).mean().iloc[-1]
end_rolling_3D = data.rolling(3).mean().iloc[-1]
if end_rolling_2D < end_rolling_3D and start > end :
print(data.columns)
但是我有这个错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我真的不知道如何解决这个问题,我知道那个问号应该是'Mathieu',因为他是唯一符合条件的人。
我对Python还是很陌生,所以如果有人想解决这个问题,欢迎您!
谢谢。
答案 0 :(得分:2)
start
,end
,end_rolling_2D
和end_rolling_3D
是Series
对象,请使用pd.Series.all()
替换
if end_rolling_2D > end_rolling_3D and start > end
使用
if ((end_rolling_2D>end_rolling_3D) & (start>end)).all()
要获取满足条件的位置,请使用boolean indexing
mask = (end_rolling_2D<end_rolling_3D) & (start>end)
print(df.columns[mask])
# Index(['Mathieu'], dtype='object')
答案 1 :(得分:0)
将功能更改为:
def test(data):
end = data.iloc[-1]
start = data.iloc[0]
end_rolling_2D = data.rolling(2).mean().iloc[-1]
end_rolling_3D = data.rolling(3).mean().iloc[-1]
if ((end_rolling_2D > end_rolling_3D) & (start > end)).all() :
print(data.columns)
请注意,我添加了方括号。并将and
替换为&
但是,我不希望有任何符合您条件的数据。