如何根据 pandas 中另一列的条件更改数据帧元素



我已经环顾四周(例如这里(,但我不明白为什么我的代码没有按预期工作。 我有一个 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

有什么想法吗?

对于混合类型的数据帧(如此处(,pandas 似乎在使用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

按索引降序排序,然后循环查找第一行。

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

您可以从for 循环中更改df.iloc[i]['C']=Truedf.loc[i, 'C'] = True使其工作。

但我宁愿使用以下方法来提高效率:

df = pd.DataFrame({'B':[0,0,1,0,1,0,0,1]})
df['Check'] = df['B'].shift(-1)
df['C'] = df['B'] < df['Check']
Out:
B  Check      C
0  0    0.0  False
1  0    1.0   True
2  1    0.0  False
3  0    1.0   True
4  1    0.0  False
5  0    0.0  False
6  0    1.0   True
7  1    NaN  False

最新更新