我有一个数据框,其中的列x
包含由数字和字母组成的字符串,如下所示
x
1 a
2 b
3 a
34 c
35 d
我想将此列拆分为两个 y
和 z
,一个包含数值,另一个包含字符串,所以我这样做
df['y']=df['x'].str.strip().str.split(' ').str.get(0)
df['z']=df['x'].str.split(' ').str.get(1)
有没有更有效的方法?当在大文件中应用此操作时,需要几分钟的时间。
更新:字符串和数字是可选的,并不总是出现。可能有一个数字或一个字符串 示例:
x =['6.1 a', ' d', '6.5', '5.6 c', '6.9', '6.1', '5.9 b', '4.5', '4.3', '4.3', '5.7', '5.7', '4.7 x', '5.1', '5.1']
进入
y=['6.1', '', '6.5', '5.6', '6.9', '6.1', '5.9', '4.5', '4.3', '4.3', '5.7', '5.7', '4.7', '5.1', '5.1']
z=['a', 'd', '', 'c', '', '', 'b', '', '', '', '', '', 'x', '', '']
最佳答案
您可以将 apply 与 lambda 一起使用,其速度比您的解决方案更快:
df["y"] = df.x.apply(lambda x:x.split()[0])
df["z"] = df.x.apply(lambda x:x.split()[1] if len(x.split())>1 else "ND")
df
x y z
0 1 a 1 a
1 2 b 2 b
2 3 a 3 a
3 34 c 34 c
4 35 d 35 d
5 1.5 1.5 ND
我无法与扩展版本进行比较,因为我没有最新的 pandas 版本。 我认为它比提取版本更快。
如果您不关心使用 pandas 方法,那么使用字符串方法和列表理解会更快:
y, z = zip(*[(i.split()[0], i.split()[1] if " " in i else "") for i in x])
不过,您可以轻松地将其放入 df 中。
时间
与
def ori(df):
df['y']=df['x'].str.strip().str.split(' ').str.get(0)
df['z']=df['x'].str.split(' ').str.get(1)
def lam(df):
df["y"] = df.x.apply(lambda x:x.split()[0])
df["z"] = df.x.apply(lambda x:x.split()[1] if len(x.split())>1 else "ND")
编辑:条件相对时间相同。
当 len(df) = 5 时
%timeit lam(df)
1000 loops, best of 3: 818 µs per loop
%timeit ori(df)
1000 loops, best of 3: 1.63 ms per loop
当 len(df) = 10000 时
%timeit lam(df)
10 loops, best of 3: 16.4 ms per loop
%timeit ori(df)
10 loops, best of 3: 33.1 ms per loop
关于python - 更有效地拆分列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337228/