列中的前五个非数字,非null,不同的值

时间:2017-02-20 15:44:14

标签: pandas

如何从列中获取前五个非数字,非空,不同的值?

例如,给出如下表格

col1 
=====
n1 
1        
2        
n2
n3
n3
n4
n5
n5
n6
None

我想要

 col1 
=====
n1       
n2
n3
n4
n5

2 个答案:

答案 0 :(得分:1)

您可以使用pd.to_numeric将非NaN强制为NaN,然后反转掩码并选择前5个唯一值:

In [9]:
df.loc[df.index.difference(pd.to_numeric(df['col1'], errors='coerce').dropna().index),'col1'].unique()[:5]

Out[9]:
array(['n1', 'n2', 'n3', 'n4', 'n5'], dtype=object)

答案 1 :(得分:1)

您可以使用:

df = pd.DataFrame({'col1':['n1', '1', '2', 'n2', 'n3', 'n3', 'n4', 'n5', 'n5', 'n6','None']})
df = df.loc[pd.to_numeric(df.col1.replace({'None':1, 'NaN':1}), 
                          errors='coerce').isnull(), 'col1']
       .drop_duplicates()
       .head(5)
       .reset_index(drop=True)

print (df)
0    n1
1    n2
2    n3
3    n4
4    n5
Name: col1, dtype: object

另一种可能的解决方案:

df = pd.Series(df.loc[pd.to_numeric(df.col1
                        .replace({'None':1, 'NaN':1}), errors='coerce').isnull(), 'col1']
      .unique()[:5])
print (df)
0    n1
1    n2
2    n3
3    n4
4    n5
dtype: object

但如果是混合值 - 数字与strings

df = pd.DataFrame({'col1':['n1', 1, 1, 'n2', 'n3', 'n3', 'n4', 'n5', 'n5', 'n6', None]})

df = pd.Series(df.loc[df.col1.apply(lambda x: isinstance(x, str)), 'col1']
       .unique()[:5])

print (df)
0    n1
1    n2
2    n3
3    n4
4    n5
dtype: object