【问题标题】:opening csv file in a numpy.txt in python3在 python3 的 numpy.txt 中打开 csv 文件
【发布时间】:2019-11-05 01:56:31
【问题描述】:

我有一个 csv 文件并尝试使用 numpy.loadtxt 打开它。 如果我使用 pandas 打开它,文件将如下所示:

小例子:

Name       Accession  Class Species  Annotation  CF330
NaN             NaN         NaN          NaN         NaN         NaN
A2M     NM_000014.4  Endogenous           Hs         NaN     11495.0
ACVR1C     NM_145259.2  Endogenous           Hs         NaN        28.0
ADAM12     NM_003474.5  Endogenous           Hs         NaN      1020.0
ADGRE1  NM_001256252.1  Endogenous           Hs         NaN        42.0

我正在尝试使用 numpy.loadtxt 并使用以下代码打开文件:

with open('datafile1.csv') as f:
    for line in f:
        FH = np.loadtxt(line, delimiter=',', skiprows=1)

print(FH)

但它返回此错误:

ValueError: could not convert string to float: 

你知道如何解决这个问题吗?

这里是原始数据集:

Name,Accession,Class,Species,Annotation,CF330
,,,,,
A2M,NM_000014.4,Endogenous,Hs,,11495
ACVR1C,NM_145259.2,Endogenous,Hs,,28
ADAM12,NM_003474.5,Endogenous,Hs,,1020
ADGRE1,NM_001256252.1,Endogenous,Hs,,42

【问题讨论】:

  • @Adam.Er8:我在最后添加了。
  • 很好奇为什么要将不同类型的数据集加载到 numpy 数组中?回想一下数据框和数组之间的根本区别,其中数据框是等长的不同数据类型的集合,而数组在所有元素中保持单一类型。这里有字符串和数字,所以使用 pandas。

标签: python-3.x pandas csv numpy


【解决方案1】:
In [19]: txt = '''Name,Accession,Class,Species,Annotation,CF330 
    ...: ,,,,, 
    ...: A2M,NM_000014.4,Endogenous,Hs,,11495 
    ...: ACVR1C,NM_145259.2,Endogenous,Hs,,28 
    ...: ADAM12,NM_003474.5,Endogenous,Hs,,1020 
    ...: ADGRE1,NM_001256252.1,Endogenous,Hs,,42'''   

使用dtype=Nonegenfromtxt 为我们提供了一个结构化数组:

In [23]: np.genfromtxt(txt.splitlines(), names=True, dtype=None, encoding=None,delimiter=',')        
Out[23]: 
array([('', '', '', '', False,    -1),
       ('A2M', 'NM_000014.4', 'Endogenous', 'Hs', False, 11495),
       ('ACVR1C', 'NM_145259.2', 'Endogenous', 'Hs', False,    28),
       ('ADAM12', 'NM_003474.5', 'Endogenous', 'Hs', False,  1020),
       ('ADGRE1', 'NM_001256252.1', 'Endogenous', 'Hs', False,    42)],
      dtype=[('Name', '<U6'), ('Accession', '<U14'), ('Class', '<U10'), ('Species', '<U2'), ('Annotation', '?'), ('CF330', '<i8')])

数据框形式:

In [26]: pd.DataFrame(_23)                                                                           
Out[26]: 
     Name       Accession       Class Species  Annotation  CF330
0                                                   False     -1
1     A2M     NM_000014.4  Endogenous      Hs       False  11495
2  ACVR1C     NM_145259.2  Endogenous      Hs       False     28
3  ADAM12     NM_003474.5  Endogenous      Hs       False   1020
4  ADGRE1  NM_001256252.1  Endogenous      Hs       False     42

loadtxtgenfromtxt 的默认 dtypefloat。如果文件包含无法转换的字符串,则会在 loadtxt 中出现错误;和nangenfromtxt。这些函数的文档很长,但如果你想正确使用它们,值得一读。

np.loadtxt(
    fname,
    dtype=<class 'float'>,      # DEFAULT DTYPE
    comments='#',
    delimiter=None,
    converters=None,
    skiprows=0,
    usecols=None,
    unpack=False,
    ndmin=0,
    encoding='bytes',
    max_rows=None,
)

loadtxt 的其他用法:

In [31]: np.loadtxt(txt.splitlines(), skiprows=1, dtype=str, encoding=None,delimiter=',')            
Out[31]: 
array([['', '', '', '', '', ''],
       ['A2M', 'NM_000014.4', 'Endogenous', 'Hs', '', '11495'],
       ['ACVR1C', 'NM_145259.2', 'Endogenous', 'Hs', '', '28'],
       ['ADAM12', 'NM_003474.5', 'Endogenous', 'Hs', '', '1020'],
       ['ADGRE1', 'NM_001256252.1', 'Endogenous', 'Hs', '', '42']],
      dtype='<U14')
In [32]: np.loadtxt(txt.splitlines(), skiprows=1, dtype=object, encoding=None,delimiter=',')         
Out[32]: 
array([['', '', '', '', '', ''],
       ['A2M', 'NM_000014.4', 'Endogenous', 'Hs', '', '11495'],
       ['ACVR1C', 'NM_145259.2', 'Endogenous', 'Hs', '', '28'],
       ['ADAM12', 'NM_003474.5', 'Endogenous', 'Hs', '', '1020'],
       ['ADGRE1', 'NM_001256252.1', 'Endogenous', 'Hs', '', '42']],
      dtype=object)

【讨论】:

    【解决方案2】:

    使用dtype=object

    例如:

    FH = np.loadtxt('datafile1.csv', delimiter=',', skiprows=1, dtype=object)
    print(FH)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 2016-01-28
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2016-11-16
    相关资源
    最近更新 更多