如何从dataframe列中的浮点值中删除字母表

时间:2017-06-22 23:42:21

标签: python csv dataframe lambda

我有一个数据框:

A            B
10.1        33.3
11.2        44.2s
12.3        11.3s
14.2s       *
15.4s       nan

我希望输出为

A            B
10.1        33.3
11.2        44.2
12.3        11.3
14.2          0
15.4         0

如何删除这些拖尾字母

我试过这段代码

第一种方法:

bulb_temp_df['A'].str.extract('(\d)').astype(float)
bulb_temp_df['B'].str.extract('(\d)').astype(float)

第二种方法:

bulb_temp_df['A'] = 
bulb_temp_df['A'].astype(str)
bulb_temp_df['A'] = 
bulb_temp_df['A'].map(lambda x: x.rstrip('aAbBcC'))

这些都不起作用。他们没有从柱子上移除尾料。

第三种方法

bulb_temp_df[cols]=bulb_temp_df[cols].apply(lambda x:x.str.extract('(\d+\.\d+)',expand=False)
                                .astype(float)
                                .fillna(0))`

所有这些都不起作用。最后一个删除尾部但它将没有's'的值转换为零或nan。

3 个答案:

答案 0 :(得分:1)

首先,我将创建一个可重现的示例:

from io import StringIO
import re
import numpy as np
import pandas as pd

s = StringIO('''\
       A           B
1   10.1        33.3
2   11.2       44.2s
3   12.3       11.3s
4   14.2s          *
5   15.4s        nan
''')


df = pd.read_table(s, sep='\s\s+',engine='python')
df['A'] = df['A'].astype(str)
df['B'] = df['B'].astype(str)

现在,您可以使用正则表达式和re.sub

df = df.applymap(lambda x: re.sub(r'[^0-9^\-\.]+', '', x)).replace('', np.float64(0)).astype('float64') 

print(df)

<强>输出:

      A     B
1  10.1  33.3
2  11.2  44.2
3  12.3  11.3
4  14.2   0.0
5  15.4   0.0

答案 1 :(得分:0)

这不是很干净,但它有效!

<h2><strong>Categorie: </strong><span id="merk">Bijoux-Horloges</span></h2>
 <span id="test"></span>


<script>
var categorie = document.getElementById("merk").textContent;
var test = document.getElementById("test");

if(categorie != 'autos'){	
    test.innerHTML = "<h2>Merk: Bijoux</h2>";
}else{
	test.innerHTML = "<strong>Merk: </strong>Bijoux";
}

</script>

这样做是为了使用格式化数据制作新的pandas数据帧。它通过搜索正则表达式import re import pandas as pd def cleanup(df, column): temp = str(df[column]) vals = re.split("(\d+\.\d+|\*|NaN)", temp)[1::2] out = [float(a.replace('*', '0').replace('NaN', '0')) for a in vals] return out bulb_temp_df = pd.DataFrame(data=list(zip(cleanup(bulb_temp_df, 'A'), cleanup(bulb_temp_df, 'B'))), columns=['A', 'B']) 来格式化它,它将找到所有浮点数,*&#39; s或NaN&#39; s。使用这个正则表达式,我们将基于找到3个提到的模式之一的列分割成一个字符串。然后我们采用每个奇数索引,因为它包含了感兴趣的东西。

现在,我们有一个没有s的浮点数字符串列表,以及*和Nans。列表理解用0替换所有*和NaN&并将所有元素转换为float(因为它们仍然是字符串)。

不优雅,但有效!

答案 2 :(得分:0)

我发现这是一个简单的方法(如here所述) -
使用replace仅保留数字(以及dotminus符号) 这将删除字符,字母或任何未在to_replace属性中定义的内容。

所以,解决方案是:
df['A1'].replace(regex=True, inplace=True, to_replace=r'[^0-9.\-]', value=r'']
df['A1'] = df['A1'].astype(float64)