Разделенный столбец, который содержит как str, так и int - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть столбец, который должен содержать только целые числа, однако из-за ошибок в данных он в настоящее время содержит как строки, так и целые числа. Мне нужно применить оператор np.where, который говорит следующее np.where(df['IO8'] >= 2002),"NEW","OLD")

Оператор завершается ошибкой с ошибкой не может использовать> = для строк. Как бы мне обойти это? Любая помощь будет отличной. Дайте мне знать, если потребуется дополнительная информация. Я также пытался использовать регулярные выражения, как показано ниже:

df['split'] = pd.np.where(df['IO8'].str.contains("^\d{4}$", regex=True), "Number", "Error")
df['IO8'] = pd.np.where(df['split'].str.contains("Number"), df['IO8'].astype(int), df['IO8'].astype(str))
df['split1'] = pd.np.where(df['split'].str.contains("Number") & (df['IO8'] >= 2002),"NEW","OLD")

Но все равно получаю сообщение об ошибке.

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

Используйте Series.str.extract для получения лет в новый столбец с преобразованием в числа с плавающей запятой:

df = pd.DataFrame({'IO8':['2000','2009','20','dwd21']})

df['num'] = df['IO8'].str.extract("(^\d{4}$)").astype(float)

Тогда возможно использование numpy.select для 3 состояний:

m1 = df['num'].notna()
m2 = df['num'] >= 2002
df['split1'] = pd.np.select([m1 & m2, m1 & ~m2],["NEW","OLD"], default='no match')

Или используйте double np.where:

df['split1'] = pd.np.where(m2, "NEW", pd.np.where(m1, "OLD", 'no match'))

print (df)
     IO8     num    split1
0   2000  2000.0       OLD
1   2009  2009.0       NEW
2     20     NaN  no match
3  dwd21     NaN  no match

Потому что, если использовать только np.where, выведите:

df = pd.DataFrame({'IO8':['2000','2009','20','dwd21']})

df['num'] = df['IO8'].str.extract("(^\d{4}$)").astype(float)

m1 = df['num'].notna()
m2 = df['num'] >= 2002
df['split1'] = pd.np.where(m1 & m2, "NEW","OLD")

print (df)
     IO8     num split1
0   2000  2000.0    OLD
1   2009  2009.0    NEW
2     20     NaN    OLD
3  dwd21     NaN    OLD
0 голосов
/ 10 февраля 2020

@ Автор, вы тоже хотели бы видеть это

b = df['IO8'].apply(lambda x: "New" if (x.isnumeric() and int(x) >= 2002) else "None" if not x.isnumeric() else "Old")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...