熊猫数据框:删除次要的相同值

时间:2018-12-06 15:33:26

标签: python pandas dataframe

我有一个数据框:

plt.close("all")

col1 col2 a 0 b 1 c 1 d 0 c 1 d 0 上,我只想保留顶部的第一个'col2',并用1替换第一个下面的每个1,这样输出是:

0

非常感谢。

8 个答案:

答案 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)