Как сохранить только числа в столбце данных, который также имеет строки? - PullRequest
0 голосов
/ 05 сентября 2018

В моем фрейме данных есть следующий столбец:

Column1   Column2    Column3     Column4
a            1           2           a     
1            2           a           c
b            3           c           d
3            2           1           b
4            2           1           a
c            1           d           a

Тип этих столбцов object, я хотел бы преобразовать Column1, Column2 и Column3 в числовой тип int8, сохраняя Column4 в качестве объекта типа. Для этого я пытался использовать pd.to_numeric(data.Column1) (я планировал сделать то же самое после с Column2 и Column3), но я получаю следующую ошибку:

ValueError: Unable to parse string "a" at position 0

Что очевидно, почему это происходит. Мне было интересно, есть ли какой-нибудь способ, который позволил бы мне избавиться от этих строк, образованных строками в этих 3 столбцах, поэтому после этого я получу:

Column1    Column 2    Column 3   Column 4
3            2           1           b
4            2           1           a

Есть ли способ добиться этого? Или есть другой способ, который позволил бы мне?

Редактировать: Я проверил вопрос в Удалить нечисловые строки в одном столбце с пандами , но это не решило мою проблему, так как у меня больше столбцов в моем набор данных, а не только два, и один из них я не хочу преобразовывать в числовой.

1 Ответ

0 голосов
/ 05 сентября 2018

Используйте apply с to_numeric для замены нечисловых на пропущенные значения, затем удалите строки NaN s на dropna и последние приведение к integer с:

df = df.apply(lambda x: pd.to_numeric(x, errors='coerce')).dropna().astype(int)
print (df)
   Column1  Column2  Column3
3        3        2        1
4        4        2        1

Деталь

print (df.apply(lambda x: pd.to_numeric(x,errors='coerce')))
   Column1  Column2  Column3
0      NaN      1.0      2.0
1      1.0      2.0      NaN
2      NaN      NaN      NaN
3      3.0      2.0      1.0
4      4.0      2.0      1.0
5      NaN      1.0      NaN

EDIT:

Другим решением является проверка, если не пропущены значения с DataFrame.all с boolean indexing:

cols = ['Column1','Column2','Column3']
#define columns for check numeric
mask = df[cols].apply(lambda x: pd.to_numeric(x, errors='coerce')).notnull().all(axis=1)
#filtering
df = df[mask]
#converting to integers
df[cols] = df[cols].astype(int)
print (df)
   Column1  Column2  Column3 Column4
3        3        2        1       b
4        4        2        1       a

print (df.dtypes)
Column1     int32
Column2     int32
Column3     int32
Column4    object
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...