拆分包含 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 数据框的列拆分为多列