使用Pandas删除数据框中具有不同连续值的行

时间:2017-10-03 13:56:45

标签: python pandas dataframe row

我有以下数据框:

import pandas as pd
df = pd.DataFrame({"A":['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'], "M":[11,4,9,2,2,5,5,6,6]})

我的目标是删除列M的2个连续值彼此不相等的所有行。

因此,应删除第0,1和2行,因为M的值为:11!= 4,4!= 9和9!= 2)。但是,如果2行具有相同的连续值,则必须保留:必须保留第3行和第4行,因为它们都具有值2.第5行和第6行的相同推理值为5.

我能够通过使用以下代码行达到目标:

l=[]
for i, row in df.iterrows():
    try:
        if df["M"].iloc[i]!=df["M"].iloc[i+1] and df["M"].iloc[i]!=df["M"].iloc[i-1]:
            l.append(i)
    except:
        pass
df = df.drop(df.index[l]).reset_index(drop=True)

您能否提出更智能,更好的方法来实现我的目标?也许通过使用一些内置的pandas功能?

以下是数据框的外观:

Before: 
   A   M
0  a  11 <----Must be removed
1  s   4 <----Must be removed
2  d   9 <----Must be removed
3  f   2
4  g   2
5  h   5
6  j   5
7  k   6
8  l   6

After
   A  M
0  f  2
1  g  2
2  h  5
3  j  5
4  k  6
5  l  6

2 个答案:

答案 0 :(得分:3)

boolean indexingshift创建的mask一起使用:

m = (df["M"].eq(df["M"].shift()) | df["M"].eq(df["M"].shift(-1)))
#alternative
#m = ~(df["M"].ne(df["M"].shift()) &  df["M"].ne(df["M"].shift(-1)))
print (df[m])
   A  M
3  f  2
4  g  2
5  h  5
6  j  5
7  k  6
8  l  6

答案 1 :(得分:3)

使用diff

df.loc[df.M.isin(df[df.M.diff()==0].M),:]
Out[140]: 
   A  M
3  f  2
4  g  2
5  h  5
6  j  5
7  k  6
8  l  6

注意上一个可能不起作用。(当1,1,2,1,3,4时)

m=df[df.M.diff()==0].index.values.tolist()
m.extend([x-1 for x in m])
df.loc[set(m)].sort_index()

MaxU的另一个不错的答案:

df.loc[df.M.diff().eq(0) | df.M.diff(-1).eq(0)]