从Pandas

时间:2016-02-13 05:16:58

标签: python pandas dataframe

假设我有一个数据框df

A B
1 V2
3 W42
1 S03
2 T02
3 U71

我希望有一个新列(在df的末尾或者用它替换列B,因为它无关紧要)只从列{{{1}中提取int 1}}。这就是我希望列B看起来像

C

所以如果数字前面有一个0,比如03,那么我想返回3而不是03

我该怎么做?

6 个答案:

答案 0 :(得分:43)

您可以转换为字符串并使用正则表达式提取整数。

df['B'].str.extract('(\d+)').astype(int)

答案 1 :(得分:2)

假设总有一个前导字母

df['B'] = df['B'].str[1:].astype(int)

答案 2 :(得分:0)

我写了一个小循环来做这件事,因为我没有在DataFrame中使用我的字符串,而是在列表中。这样,您还可以添加一个小if语句来考虑浮点数:

output= ''
input = 'whatever.007'  

for letter in input :
        try :
            int(letter)
            output += letter

        except ValueError :
                pass

        if letter == '.' :
            output += letter

output = float(输出)

或者如果你愿意,你可以int(输出)。

答案 3 :(得分:0)

准备与您的DF相同的DF:

df = pd.DataFrame({'A': [1, 3, 1, 2, 3], 'B' : ['V2', 'W42', 'S03', 'T02', 'U71']})

df.head()

现在进行操作以获得所需的结果:

df['C'] = df['B'].apply(lambda x: re.search(r'\d+', x).group())

df.head()


    A   B   C
0   1   V2  2
1   3   W42 42
2   1   S03 03
3   2   T02 02
4   3   U71 71

答案 4 :(得分:0)

如果您不想使用正则表达式,这是另一种方法: 我使用map()函数将所需的内容应用于列的每个元素。 像这样:

letters = "abcdefghijklmnopqrstuvwxyz"
df['C'] = list(map(lambda x: int(x.lower().strip(letters))   ,  df['B']))

输出将如下所示:

enter image description here

答案 5 :(得分:0)

首先设置数据

df = pd.DataFrame({'A': [1, 3, 1, 2, 3], 'B' : ['V2', 'W42', 'S03', 'T02', 'U71']})

df.head()

然后进行提取并将其转换回整数

df['C'] = df['B'].str.extract('(\d+)').astype(int)

df.head()