我有一个csv文件,如:
"B/G/213","B/C/208","WW_cis",,
"B/U/215","B/A/206","WW_cis",,
"B/C/214","B/G/207","WW_cis",,
"B/G/217","B/C/204","WW_cis",,
"B/A/216","B/U/205","WW_cis",,
"B/C/219","B/G/202","WW_cis",,
"B/U/218","B/A/203","WW_cis",,
"B/G/201","B/C/220","WW_cis",,
"B/A/203","B/U/218","WW_cis",,
我希望将其读入类似数组或数据框的内容,这样我就可以将一列中的元素与另一列中的选定元素进行比较。起初,我已经使用numpy.genfromtxt
将其直接读入数组,但我的'"B/A/203"'
之类的引号到处都有额外的引号"
。我在某处读到,大熊猫允许删除额外的"
字符串,所以我尝试了:
class StructureReader(object):
def __init__(self, filename):
self.filename=filename
def read(self):
self.data=pd.read_csv(StringIO(str("RNA/"+self.filename)), header=None, sep = ",")
self.data
但是我得到了类似的东西:
<class 'pandas.core.frame.DataFrame'> 0
0 RNA/4v6p.csv
如何将我的CSV文件转换为允许我搜索列和行的某种数据类型?
答案 0 :(得分:3)
您将文件名的字符串放入DataFrame
,即RNA/4v6p.csv
是您的位置row 0, col 0
中的数据。您需要读入文件并存储数据。这可以通过删除班级中的StringIO(str(...))
class StructureReader(object):
def __init__(self, filename):
self.filename = filename
def read(self):
self.data = pd.read_csv("RNA/"+self.filename), header=None, sep = ",")
self.data
我还建议通过
删除父目录硬编码始终传入完整的文件路径
class StructureReader(object):
def __init__(self, filepath):
self.filepath = filepath
def read(self):
self.data = pd.read_csv(self.filepath), header=None, sep = ",")
self.data
使目录成为__init__()
参数
class StructureReader(object):
def __init__(self, directory, filename):
self.directory = directory
self.filename = filename
def read(self):
self.data=pd.read_csv(self.directory+"/"+self.filename), header=None, sep = ",")
# or import os and self.data=pd.read_csv(os.path.join(self.directory, self.filename)), header=None, sep = ",")
self.data
使目录成为常量属性
class StructureReader(object):
def __init__(self, filename):
self.directory = "RNA"
self.filename = filename
def read(self):
self.data = pd.read_csv(self.directory+"/"+self.filename), header=None, sep = ",")
# or import os and self.data=pd.read_csv(os.path.join(self.directory, self.filename)), header=None, sep = ",")
self.data
这与阅读数据无关,只是构建代码的最佳实践评论(仅限$0.02)。
答案 1 :(得分:2)
IIUC,您可以通过以下方式阅读:
df = pd.read_csv('yourfile.csv', header=None)
对我而言:
0 1 2 3 4
0 B/G/213 B/C/208 WW_cis NaN NaN
1 B/U/215 B/A/206 WW_cis NaN NaN
2 B/C/214 B/G/207 WW_cis NaN NaN
3 B/G/217 B/C/204 WW_cis NaN NaN
4 B/A/216 B/U/205 WW_cis NaN NaN
5 B/C/219 B/G/202 WW_cis NaN NaN
6 B/U/218 B/A/203 WW_cis NaN NaN
7 B/G/201 B/C/220 WW_cis NaN NaN
8 B/A/203 B/U/218 WW_cis NaN NaN
然后,您只能选择所需的列:
df = df[[0,1,2]]
并像往常一样使用数据框。
答案 2 :(得分:1)
我认为你已经将StringIO与文件名混淆了。您要么将数据作为字符串,然后使用StringIO,要么只需指定文件名(使用StringIO 不):
In [189]: data="""\
.....: "B/G/213","B/C/208","WW_cis",,
.....: "B/U/215","B/A/206","WW_cis",,
.....: "B/C/214","B/G/207","WW_cis",,
.....: "B/G/217","B/C/204","WW_cis",,
.....: "B/A/216","B/U/205","WW_cis",,
.....: "B/C/219","B/G/202","WW_cis",,
.....: "B/U/218","B/A/203","WW_cis",,
.....: "B/G/201","B/C/220","WW_cis",,
.....: "B/A/203","B/U/218","WW_cis",,
.....: """
In [190]:
In [190]: df = pd.read_csv(io.StringIO(data), sep=',', header=None, usecols=[0,1,2])
In [191]: df
Out[191]:
0 1 2
0 B/G/213 B/C/208 WW_cis
1 B/U/215 B/A/206 WW_cis
2 B/C/214 B/G/207 WW_cis
3 B/G/217 B/C/204 WW_cis
4 B/A/216 B/U/205 WW_cis
5 B/C/219 B/G/202 WW_cis
6 B/U/218 B/A/203 WW_cis
7 B/G/201 B/C/220 WW_cis
8 B/A/203 B/U/218 WW_cis
PS你可以决定要解析哪些列(在数据框中有) - 查看usecols
参数
或使用文件名
import os
df = pd.read_csv(os.path.join('RNA', self.filename), sep=',', header=None, usecols=[0,1,2])