拆分包含 str 和 int 的列

Posted

技术标签:

【中文标题】拆分包含 str 和 int 的列【英文标题】:Split out column that contains both str and ints 【发布时间】:2020-05-25 17:23:44 【问题描述】:

我有一列应该只包含整数,但是由于数据错误,它当前包含字符串和整数。我需要应用一个np.where 声明,上面写着np.where(df['IO8'] >= 2002),"NEW","OLD")

语句失败并出现错误 cannot use >= on strings。我将如何解决这个问题?任何帮助都会很棒。让我知道是否需要更多细节。我也尝试过像下面这样使用正则表达式:

df['split'] = pd.np.where(df['IO8'].str.contains("^\d4$", 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")

但仍然会出现错误。

【问题讨论】:

只是为了确保@Jezrael 回答的工作,你能print(df['IO8'].head()) 吗? 【参考方案1】:

使用Series.str.extract 获取新列并转换为浮点数:

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

df['num'] = df['IO8'].str.extract("(^\d4$)").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')

或者使用双精度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("(^\d4$)").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

【讨论】:

嗨,耶兹瑞尔,谢谢! df['num'] 中的所有值都以 NaN 形式出现,因此 np.where 都以 OLD 形式出现,有什么建议吗?我知道 2002 确实存在于数据中,所以我们应该得到一些新的 您好 Mustie,请编辑您的答案以显示您的数据是什么样的,否则我们会根据我们的知识进行猜测。 @MustieMustafa - 我认为原因是 "(^\d4$)" - reegx 表示检查列是否只包含 4digits 而没有其他值,如果想从 2000data 提取 2000 然后使用 df['num'] = df['IO8'].str.extract("(\d4)").astype(float) 完美!谢谢jezrael,确实问题在于数字之间的间距。需要先修剪柱子!感谢您的帮助!【参考方案2】:

@Author,你也想看看这个

b = df['IO8'].apply(lambda x: "New" if (x.isnumeric() and int(x) >= 2002) else "None" if not x.isnumeric() else "Old")

【讨论】:

以上是关于拆分包含 str 和 int 的列的主要内容,如果未能解决你的问题,请参考以下文章

如何拆分包含字符串的列

将包含 json 数据的 pandas 数据框的列拆分为多列

将包含列表的列拆分为熊猫中的不同行[重复]

如何将包含多个键值对的列拆分为pyspark中的不同列

如何拆分包含 String 和 Int 的文本并存储到 ArrayList 中?

如何将字符串拆分为视图的列? [复制]