这一栏有两个变量,即日期和公司名称。我的目标是将这两个变量分成两列。
日期时间/完整公司名称
到目前为止,我的方法是:
df['date_time'] = [i[:10] for i in df['date_time/full_company_name']]
df['full_company_name'] = [i[10:] for i in df['date_time/full_company_name']]
df.drop('date_time/full_company_name', axis=1, inplace=True)
上面的代码运行良好,但是数据集中有许多错误的数据条目,例如:
我考虑过一些可能的解决方案,例如使用带有一堆if语句的循环来处理异常,或者在字符串中插入某种分隔符,然后使用string.split('_')
。但是这些变通方法相当麻烦。
我忍不住想知道是否还有更通用的功能或方法。
答案 0 :(得分:1)
通常,对熊猫系列或数据框的内容进行迭代不利于性能,建议在可能的情况下建议使用向量化方法:
遍历熊猫对象通常很慢。在许多情况下,不需要手动对行进行迭代,并且可以避免...
请参见the docs。
也就是说,对于“未装瓶”条目,您可以执行以下操作:
df['date_time'] = df['date_time/full_company_name'].str.slice(0, 10)
df['full_company_name'] = df['date_time/full_company_name'].str.slice(10, None)
df.drop('date_time/full_company_name', axis=1, inplace=True)
对于拙劣的条目,如果没有一致的模式,将很难提出程序化的方法,但是某些适用于您的示例并且可能会因其他已知条目错误而扩展的方法是使用extract
正则表达式:
# The first capture group is either a Y-M-D date, the NaN string or a sequence of digits
# The second one is any string
pattern = r'(\d{4}-\d{2}-\d{2}|NaN|0|\d+)(.+)'
df['date_time/full_company_name'].str.extract(pattern)
输出:
0 1
0 2020-05-19 Lopez-Wallace
1 2020-05-12 Smith-Simon
2 2020-10-02 Jenkins Inc
3 2020-07-06 Moore-Weiss
4 0 Lopez, Barton and Jones
5 NaN Brown, Singleton and Harrell
6 84635 Ball-Thomas