Как отфильтровать строки в пандах, которые являются просто числами, а не полностью числовыми? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть столбец данных Pandas, в котором есть данные в таких строках, как показано ниже:

col1     
abc
ab23
2345
fgh67@
8980

Мне нужно создать еще 2 столбца, столбец 2 и столбец 3, как показано ниже:

 col2    col3
 abc      2345
 ab23      8980
 fgh67@   

Я использовал str.isnumeric (), но это не помогает мне в столбце данных. может кто-то любезно помочь?

1 Ответ

0 голосов
/ 03 июля 2018

Используйте str.isnumeric или to_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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...