如何过滤掉只是数字而不是全数字的熊猫行?

时间:2018-07-03 04:58:35

标签: python-3.x pandas

我有一个Pandas数据框列,该列中的数据如下所示:

col1     
abc
ab23
2345
fgh67@
8980

我需要再创建2列第2列和第3列,如下所示:

 col2    col3
 abc      2345
 ab23      8980
 fgh67@   

我使用过str.isnumeric(),但这在dataframe列中对我没有帮助。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

使用str.isnumericto_numeric并检查非NaN的布尔掩码,并按boolean indexing进行过滤:

m = df['col1'].str.isnumeric()
#alternative
#m = pd.to_numeric(df['col1'], errors='coerce').notnull()
df = pd.concat([df.loc[~m, 'col1'].reset_index(drop=True), 
                df.loc[m, 'col1'].reset_index(drop=True)], axis=1, keys=('col2','col3'))
print (df)
     col2  col3
0     abc  2345
1    ab23  8980
2  fgh67@   NaN

如果要向新添加的列中按索引对齐的DataFrame

df['col2'] = df.loc[~m, 'col1']
df['col3'] = df.loc[m, 'col1']
print (df)
     col1    col2  col3
0     abc     abc   NaN
1    ab23    ab23   NaN
2    2345     NaN  2345
3  fgh67@  fgh67@   NaN
4    8980     NaN  8980

或者不对齐:

df['col2'] = df.loc[~m, 'col1'].reset_index(drop=True)
df['col3'] = df.loc[m, 'col1'].reset_index(drop=True)
print (df)
     col1    col2  col3
0     abc     abc  2345
1    ab23    ab23  8980
2    2345  fgh67@   NaN
3  fgh67@     NaN   NaN
4    8980     NaN   NaN