我有以下数据框:
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
答案 0 :(得分:3)
将boolean indexing
与shift
创建的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)]