我有一个数据框:
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。
答案 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
仅保留数字(以及dot
和minus
符号)
这将删除字符,字母或任何未在to_replace
属性中定义的内容。
所以,解决方案是:
df['A1'].replace(regex=True, inplace=True, to_replace=r'[^0-9.\-]', value=r'']
df['A1'] = df['A1'].astype(float64)