我是Python的新手(这是我的第一份工作),我试图获取以下数据框的D列的前两位,并将这两位放入新的列F中:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'A' : [1, 1, 1, 4, 5, 3, 3, 4, 1, 4],
'B' : [8, 4, 3, 1, 1, 6, 4, 6, 9, 8],
'C' : [69,82,8,25,56,79,98,68,49,82],
'D' : [1663, 8818, 9232, 9643, 4900, 8568, 4975, 8938, 7513, 1515],
'E' : ['Married','Single','Single','Divorced','Widow(er)','Single','Married','Divorced','Married','Widow(er)']})
我在Stack Overflow上找到了几种可能的解决方案,并尝试应用它们,但没有一个对我有用。要么我得到一些错误消息(具体取决于我尝试应用的解决方案),但我没有得到期望的结果。
答案 0 :(得分:2)
这是使用NumPy的解决方案。它要求D
中的数字至少包含2位数字。
df = pd.DataFrame({'D': [1663, 8818, 9232, 9643, 31, 455, 43153, 45]})
df['F'] = df['D'] // np.power(10, np.log10(df['D']).astype(int) - 1)
print(df)
D F
0 1663 16
1 8818 88
2 9232 92
3 9643 96
4 31 31
5 455 45
6 43153 43
7 45 45
如果您所有的数字均为4位数字,则只需使用df['F'] = df['D'] // 100
。
对于较大的数据帧,这些数字方法比将整数转换为字符串,提取前两个字符并转换回int
的效率更高。
答案 1 :(得分:1)
尝试一下:
import math
def first_two(d):
return (d // 10 ** (int(math.log(d, 10)) - 1))
df1['F'] = df1.D.apply(first_two)
输出:
In [212]: df1
Out[212]:
A B C D E F
0 1 8 69 1663 Married 16
1 1 4 82 8818 Single 88
2 1 3 8 9232 Single 92
3 4 1 25 9643 Divorced 96
4 5 1 56 4900 Widow(er) 49
5 3 6 79 8568 Single 85
6 3 4 98 4975 Married 49
7 4 6 68 8938 Divorced 89
8 1 9 49 7513 Married 75
9 4 8 82 1515 Widow(er) 15
大多数SO解决方案都使用字符串切片-这将使用math
进行“切片”。
df1['F'] = df1.D.apply(lambda d: d // 10 ** (int(math.log(d, 10)) - 1))
不包括设置-如上所述。
#string slice method
In [255]: print(t.timeit(100))
3.3840187825262547e-06
#'first_two' method
In [252]: print(t.timeit(100))
1.8120044842362404e-06
#'lambda' method
In [249]: print(t.timeit(100))
1.9049621187150478e-06
奇怪的是,调用该方法的速度比lambda
(?)
答案 2 :(得分:1)
您可以使用类似的内容:
df1['f'] = df1.D.astype(str).str[:2].astype(int)