我已经环顾四周(例如here),但是我不明白为什么我的代码无法按预期工作。 我有一个pandas数据框,我想添加一列以标记B列中非零元素上方的最后一个零元素。
df = pd.DataFrame({'B':[0,0,1,0,1,0,0,1]})
N = len(df.index)
df['C'] = N*[False]
for i in range(N-1):
if (df.iloc[i]['B']==0 and df.iloc[i+1]['B']>0):
df.iloc[i]['C']=True
尽管条件满足3次,但C列仍然全为假,并且我还得到一条警告,我不明白:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
有什么想法吗?
答案 0 :(得分:1)
对于具有混合类型的数据框(如此处),似乎熊猫在使用iloc
和类似函数时会创建副本。您可以执行以下操作来代替链索引:
df.iloc[i, df.columns.get_loc('C')]=True
或
df.at[i, 'C'] = True
但是,我建议您用此替换您的for循环,这对我来说似乎更简单:
df['C'] = [df.iloc[i]['B'] == 0 and df.iloc[i+1]['B'] > 0 for i in range(N - 1)] + [False]
编辑:如果您实际上想查找零元素之前最后一次出现的非零元素,请尝试以下操作:
df['C'].where(df['C']).last_valid_index()
这将输出6
答案 1 :(得分:0)
按索引降序排序,然后循环查找第一行。
df=df.sort_index(ascending=False)
df['C'] = False
for i in range(len(df['B'])):
if df.iloc[i-1,0] - 1 == df.iloc[i,0]:
df.iloc[i,1] = True
break
df=df.sort_index(ascending=True)
df
B C
0 0 False
1 0 False
2 1 False
3 0 False
4 1 False
5 0 False
6 0 True
7 1 False
答案 2 :(得分:0)
您可以在for循环中更改hour = int(input("Starting time (hours): "))
mins = int(input("Starting time (minutes): "))
dura = int(input("Event duration (minutes): "))
minresult = ((mins + dura) % 60)
hourresult = (((mins + dura)//60 + hour) % 24)
print("The event will end on", hourresult,":" ,minresult)
到df.iloc[i]['C']=True
使其正常工作。
但是我宁愿使用以下内容使其效率更高:
df.loc[i, 'C'] = True