我正在处理一个约32.000.000行的数据集:
RangeIndex: 32084542 entries, 0 to 32084541
df.head()
time device kpi value
0 2020-10-22 00:04:03+00:00 1-xxxx chassis.routing-engine.0.cpu-idle 100
1 2020-10-22 00:04:06+00:00 2-yyyy chassis.routing-engine.0.cpu-idle 97
2 2020-10-22 00:04:07+00:00 3-zzzz chassis.routing-engine.0.cpu-idle 100
3 2020-10-22 00:04:10+00:00 4-dddd chassis.routing-engine.0.cpu-idle 93
4 2020-10-22 00:04:10+00:00 5-rrrr chassis.routing-engine.0.cpu-idle 99
我的目标是创建一个名为role的传统列,用regex 填充
这是我的方法
def router_role(row):
if row["device"].startswith("1"):
row["role"] = '1'
if row["device"].startswith("2"):
row["role"] = '2'
if row["device"].startswith("3"):
row["role"] = '3'
if row["device"].startswith("4"):
row["role"] = '4'
return row
然后,
df = df.apply(router_role,axis=1)
然而,这需要很多时间。。。还有其他可能的方法吗?
感谢
Apply非常慢,从来都不是很好。试试这样的东西:
df['role'] = df['device'].str[0]
使用apply
是出了名的慢,因为它没有利用多线程(例如,请参阅pandas multiprocessing apply(。相反,使用内置:
>>> import pandas as pd
>>> df = pd.DataFrame([["some-data", "1-xxxx"], ["more-data", "1-yyyy"], ["other-data", "2-xxxx"]])
>>> df
0 1
0 some-data 1-xxxx
1 more-data 1-yyyy
2 other-data 2-xxxx
>>> df["Derived Column"] = df[1].str.split("-", expand=True)[0]
>>> df
0 1 Derived Column
0 some-data 1-xxxx 1
1 more-data 1-yyyy 1
2 other-data 2-xxxx 2
在这里,我假设连字符之前可能有多个数字(例如42-aaaa
(,因此需要额外的工作来拆分列并获得拆分的第一个值。如果你刚得到第一个字符,就按照@teepee在他们的答案中所做的那样,只需索引到字符串中。
您可以简单地将代码转换为使用np.vectorize()
。
请参见此处:Pandas应用与np.vectorize的性能从现有列创建新列