[英]How to change values in certain column of DataFrame based on another DataFrame in Pandas
[英]How to change a dataframe element based on condition on another column in pandas
我环顾四周(例如这里),但我不明白为什么我的代码没有按预期工作。 我有一个 pandas dataframe 并且我想添加一列,在非零元素上方标记 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
您可以将df.iloc[i]['C']=True
从 for 循环内部更改为df.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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.