繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM