2017-02-27 75 views
0

你好,我一直在努力解决这个问题解析制表符分隔值,我想遍历行,并从中选择数据,然后将其分配给变量。这是我第一次使用熊猫,我不知道如何选择数据从文本文件变量

reader = pd.read_csv(file_path, sep="\t" ,lineterminator='\r', usecols=[0,1,2,9,10],) 

for row in reader: 
    print(row) 
    #id_number = row[0] 
    #name = row[2] 
    #ip_address = row[1] 
    #latitude = row[9] 

,这是该行的输出,我想分配给变量:

050000 

129.240.228.138 

planetlab2.simula.no 

59.93 

编辑:也许这对大熊猫来说不是问题,但对于一般的Python来说这不是问题。我对python相当陌生,我试图实现的目标是逐行解析制表符分隔的文件,并将数据分配给变量并在一个循环中打印出来。

这是输入文件样本:

050263 128.2.211.113 planetlab-1.cmcl.cs.cmu.edu NA US Allegheny County Pittsburgh http://www.cs.cmu.edu/ Carnegie Mellon University 40.4446 -79.9427 unknown 
050264 128.2.211.115 planetlab-3.cmcl.cs.cmu.edu NA US Allegheny County Pittsburgh http://www.cs.cmu.edu/ Carnegie Mellon University 40.4446 -79.9427 unknown 
+1

你是什么意思分配给变量?个别数据点或整列?为什么呢?每个都包含在一个数据框中,可以用'.loc','.ix'或'[]'引用。 – Parfait

+0

我的意思是在输入文件中,数据在每一行上都是制表符分隔的(id \ taddress \ tname \ tlatitude等)。我想逐行迭代并将数据分配给变量 –

+0

*阅读器*的外观如何?你期望的输出是什么?由于熊猫可以阅读制表符分隔的文件,因此不甚理解。列不是行分配。 – Parfait

回答

0

的你所描述的一般工作流程是:你想读取一个csv,在文件中找到一行某个ID,并将该行中的所有值解压缩为变量。这对于熊猫来说很简单。

它看起来像CSV文件中有至少10列。提供usecols arg应该过滤掉你不感兴趣的列,并且当加载到pandas DataFrame对象(你称之为reader)时,read_csv将忽略它们。

步骤做你想要什么:

  1. 阅读使用pd.read_csv()数据文件。你已经这样做了,但我建议调用这个变量df而不是reader,因为read_csv返回一个DataFrame对象,而不是Reader对象。您还会发现使用read_csv的names参数将列名分配给数据框很方便。它看起来像你想要names=['id', 'ip_address', 'name', 'latitude','longitude']将这些列作为列。 (假设col10是经度,这是有道理的,9,10将经/纬对)
  2. 查询与该ID是你感兴趣的行数据帧的对象。有多种方法可以做到这一点。一个是using the query syntax。很难知道为什么你想要这个特定的行没有更多的细节,但你可以在熊猫中查找更多关于索引查找的信息。例如:row = df.query("id == 50000")
  3. 鉴于单行,要行值提取到的变量。如果您已将列名分配给您的数据框,这很容易。您可以将该行视为值的字典。例如。 lat = row['lat']lon = row['long]
+0

您好,非常感谢您的回答,只是想补充一点,我的输入文件中没有标题,所以我想通过所有标签分隔的行(每行包含我想要的所有数据)并将它们解析为变量,所以我可以将变量添加到地图对象中,该地图对象在循环的每次迭代中都表示一个地理地图。所以基本上:1.读取线,2.解析数据,3.打印值..然后再次相同 –

+0

@FrantisekFaraks - 你看到发生了什么?你缺乏总问题的信息被误解了,这个答案对你不起作用。请向我们展示您的输入文件和所需的输出,以获得可再现的示例和更大的上下文(XY问题的X不是Y)。 – Parfait

0

您可以使用iterrows()

df = pandas.read_csv(file_path, sep=',') 
for index, row in df.iterrows(): 
    value = row['col_name'] 

或者,如果你想通过列的索引来访问:

df = pandas.read_csv(file_path, sep=',') 
for index, row in df.iterrows(): 
    value = row.ix[0] 
+0

你好,谢谢你的回答,我有问题,这是为什么索引变量需要? –

+0

'index'本质上是针对行索引的。对于上面的例子,这是没有必要的,但取决于你的用例,你可能需要它。 – ajmartin

0

您需要添加相同的每一行的值,还是需要处理的值来确定另外的价值?如果它是一致的,你可以简单地使用熊猫来对数据集进行矩阵运算。如果需要逐行处理,上述解决方案肯定是正确的。如果它是一个必须逐行添加的变量表,您可以将它们全部转储到与数据集对齐的列中,使用pandas按行添加,然后打印出完整的数据框。假设你有三列添加,你把它放到一个新的列[e]。

DF [ 'E'] = df.a + df.b + df.d

,或者,如果它是一个常数:

DF [ 'E'] = df.a + DF .B + {恒定}

然后,删除不需要的列(例如DF [ 'A']和df [ 'b']在上述)

显然,然后,如果需要根据每行的唯一值进行计算,将这些值放入另一列并如上所述进行求和。