我有一个像这样的数据框:
df
col1 col2 col3
1 A B
1 D R
2 R P
2 D F
3 T G
1 R S
3 R S
我想获取col1的前3个唯一值的数据帧。如果某些col1值稍后出现在df中,它将被忽略。
最终数据框应如下所示:
df
col1 col2 col3
1 A B
1 D R
2 R P
2 D F
3 T G
如何在熊猫中最有效的方式?
答案 0 :(得分:1)
使用Series.ne
,Series.shift
和Series.cumsum
创建助手连续组系列,然后按boolean indexing
进行过滤:
N = 3
df = df[df.col1.ne(df.col1.shift()).cumsum() <= N]
print (df)
col1 col2 col3
0 1 A B
1 1 D R
2 2 R P
3 2 D F
4 3 T G
详细信息:
print (df.col1.ne(df.col1.shift()).cumsum())
0 1
1 1
2 2
3 2
4 3
5 4
6 5
Name: col1, dtype: int32
答案 1 :(得分:1)
这是一种解决方案,可立即停止发现三个第一个不同的值
import pandas as pd
data="""
col1 col2 col3
1 A B
1 D R
2 R P
2 D F
3 T G
1 R S
3 R S
"""
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
nbr = 3
dico={}
for index, row in df.iterrows():
dico[row.col1]=True
if len(dico.keys())==nbr:
df = df[0:index+1]
break
print(df)
col1 col2 col3
0 1 A B
1 1 D R
2 2 R P
3 2 D F
4 3 T G
答案 2 :(得分:0)
您可以在 Pandas 中使用 duplicated
方法:
mask1 = df.duplicated(keep = "first") # this line is to get the first occ.
mask2 = df.duplicated(keep = False) # this line is to get the row that occ one single time.
mask = ~mask1 | ~mask2
df[mask]