如何提取数据帧的一列中所有数字的前两位数字?

时间:2018-06-30 23:31:14

标签: python pandas dataframe

我是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上找到了几种可能的解决方案,并尝试应用它们,但没有一个对我有用。要么我得到一些错误消息(具体取决于我尝试应用的解决方案),但我没有得到期望的结果。

3 个答案:

答案 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进行“切片”。

或具有lambda函数

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)