我从一个pdf文件中复制了一个三列的表。我在此附上PDF截图:
padj列中的值是指数值,但是,当您将pdf复制到excel,然后用熊猫打开它时,这些值是字符串或对象数据类型。因此,不能将这些值解析为浮点数或数值。我需要这些值作为浮动,而不是字符串。有人能帮我提些建议吗?到目前为止,这是我尝试过的。
然后使用UnicodeDecodeError编码在python中打开excel或csv
文件,以避免使用escape_unicode
。
## open the file
df = pd.read_csv("S2_GSE184956.csv",header=0,sep=',',encoding='unicode_escape')[["DEGs","LFC","padj"]]
df.head()
DEGs padj LFC
0 JUNB 1.5 ×10-8 -1.273329
1 HOOK2 2.39×10-7 -1.109320
2 EGR1 3.17×10-6 -4.187828
3 DUSP1 3.95×10-6 -3.251030
4 IL6 3.95×10-6 -3.415500
5 ARL4C 5.06×10-6 -2.147519
6 NR4A2 2.94×10-4 -3.001167
7 CCL3L1 4.026×10-4 -5.293694
# Convert the string to float by replacing the x10- with exponential sign
df['padj'] = df['padj'].apply(lambda x: (unidecode(x).replace('x10-','x10-e'))).astype(float)
That threw an error,
ValueError: could not convert string to float: '1.5 x10-e8'
如有任何建议,将不胜感激。谢谢
发布于 2022-10-26 10:19:21
通过在this last edit上的问题中共享数据,下面使用pandas.Series.str.replace
和pandas.Series.astype
将完成这项工作:
df['padj'] = df['padj'].str.replace('×10','e').str.replace(' ', '').astype(float)
目标是使单元格看起来像下面的1.560000e-08
。
备注:
'
。为此,可以使用pandas.Series.str.replace
,如下所示df‘’padj‘=df’‘padj’.str.替换(“‘”,’)
发布于 2022-10-26 10:20:18
考虑到您的示例(列padj),下面的代码应该可以工作:
f_value = eval(str_float.replace('x10', 'e').replace(' ', ''))
发布于 2022-10-26 10:37:55
根据您提供的数据进行更新。最重要的是,x实际上是一个时代符号:
import pandas as pd
DEGs = ["JUNB", "HOOK2", "EGR1", "DUSP1", "IL6", "ARL4C", "NR4A2", "CCL3L1"]
padj = ["1.5 ×10-8", "2.39×10-7", "3.17×10-6", "3.95×10-6", "3.95×10-6", "5.06×10-6", "2.94×10-4", "4.026×10-4"]
LFC = ["-1.273329", "-1.109320", "-4.187828", "-3.251030", "-3.415500", "-2.147519", "-3.001167", "-5.293694"]
df = pd.DataFrame({'DEGs': DEGs, 'padj': padj, 'LFC': LFC})
# change to python-friendly float format
df['padj'] = df['padj'].str.replace(' ×10-', 'e-', regex=False)
df['padj'] = df['padj'].str.replace('×10-', 'e-', regex=False)
# convert padj from string to float
df['padj'] = df['padj'].astype(float)
会给你这个数据:
https://stackoverflow.com/questions/74205860
复制相似问题