我有一个数据框:
plt.close("all")
在col1 col2
a 0
b 1
c 1
d 0
c 1
d 0
上,我只想保留顶部的第一个'col2'
,并用1
替换第一个下面的每个1
,这样输出是:
0
非常感谢。
答案 0 :(得分:10)
您可以找到第一个1
的索引,并将其他索引设置为0
:
mask = df['col2'].eq(1)
df.loc[mask & (df.index != mask.idxmax()), 'col2'] = 0
要获得更好的性能,请参见Efficiently return the index of the first value satisfying condition in array。
答案 1 :(得分:4)
情况1 :df
在col2和整数索引中只有一和零。
>>> df
col1 col2
0 a 0
1 b 1
2 c 1
3 d 0
4 c 1
5 d 0
您可以使用:
>>> df.loc[df['col2'].idxmax() + 1:, 'col2'] = 0
>>> df
col1 col2
0 a 0
1 b 1
2 c 0
3 d 0
4 c 0
5 d 0
案例2 :df
在col2中可以具有各种值,并且具有整数索引。
>>> df # demo dataframe
col1 col2
0 a 0
1 b 1
2 c 2
3 d 2
4 c 3
5 d 3
您可以使用:
>>> df.loc[(df['col2'] == 1).idxmax() + 1:, 'col2'] = 0
>>> df
col1 col2
0 a 0
1 b 1
2 c 0
3 d 0
4 c 0
5 d 0
情况3 :df
在col2中可以具有各种值,并且可以具有任意索引。
>>> df
col1 col2
u a -1
v b 1
w c 2
x d 2
y c 3
z d 3
您可以使用:
>>> df['col2'].iloc[(df['col2'].values == 1).argmax() + 1:] = 0
>>> df
col1 col2
u a -1
v b 1
w c 0
x d 0
y c 0
z d 0
答案 2 :(得分:4)
np.flatnonzero
因为我认为我们需要更多答案
df.loc[df.index[np.flatnonzero(df.col2)[1:]], 'col2'] -= 1
df
col1 col2
0 a 0
1 b 1
2 c 0
3 d 0
4 c 0
5 d 0
同样的东西,但是更加隐秘。
df.col2.values[np.flatnonzero(df.col2.values)[1:]] -= 1
df
col1 col2
0 a 0
1 b 1
2 c 0
3 d 0
4 c 0
5 d 0
答案 3 :(得分:3)
您可以使用numpy
作为有效的解决方案:
a = df.col2.values
b = np.zeros_like(a)
b[a.argmax()] = 1
df.assign(col2=b)
col1 col2
0 a 0
1 b 1
2 c 0
3 d 0
4 c 0
5 d 0
答案 4 :(得分:3)
将flex: 0 0 100%;
与drop_duplicates
一起使用
reindex
答案 5 :(得分:1)
我也喜欢
data['col2'][np.where(data['col2'] == 1)[0][0]+1:] = 0
答案 6 :(得分:1)
很多选择,这是我的...与timgebs答案几乎相同(独立发现),但仍然不同;)
找到第一次出现的col2索引为1,并将该索引之后的所有行值都更改为0:
df['col2'].iloc[df.col2.idxmax()+1:] = 0
答案 7 :(得分:0)
id = list(df["col2"]).index(1)
df.iloc[id+1:]["col2"].replace(1,0,inplace=True)