【问题标题】:parsing tab delimited values from text file to variables将制表符分隔的值从文本文件解析为变量
【发布时间】:2017-07-17 11:57:46
【问题描述】:

您好,我一直在努力解决这个问题,我正在尝试遍历行并从中选择数据,然后将它们分配给变量。这是我第一次使用pandas,我不知道如何选择数据

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

【问题讨论】:

  • 分配给变量是什么意思?单个数据点还是整列?为什么要这样做?每个都包含在一个数据框中,可以通过.loc.ix[] 引用。
  • 我的意思是,在输入文件中,数据在每一行上都是制表符分隔的(id\taddress\tname\tlatitude 等)。我想逐行迭代并将数据分配给变量
  • reader 长什么样子?你想要的输出是什么?不太了解,因为 pandas 可以读取制表符分隔的文件。并且分配了列而不是行。
  • 我想要的输出基本上就是我所说的逐行迭代文件并将每一行的数据分配给变量。然后打印它们。这必须在循环中完成。至于 Reader 那是我的错误,该变量应该称为 df。
  • 还是不明白为什么。您可能不需要熊猫,但需要通用 python。 pandas Dataframe 中的每一列都是一个 pandas Series,它是一种类型(整数、字符串、日期时间),可以是您的 变量。按行分配结合了不同的类型,您将不再有系列来运行各种功能。您希望如何处理这些变量?请使用更多信息(输入和输出)编辑您的帖子,因为这将成为XY problem

标签: python parsing pandas csv


【解决方案1】:

你可以使用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]

【讨论】:

  • 您好,谢谢您的回答,我有个问题,为什么需要索引变量?
  • index 本质上是用于行索引。对于上面的示例,它不是必需的,但根据您的用例,您可能需要它。
【解决方案2】:

您描述的一般工作流程是:您要读取 csv,在文件中找到具有特定 ID 的行,然后将该行中的所有值解压缩到变量中。这对 pandas 来说很简单。

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

做你想做的事的步骤:

  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。如果没有更多详细信息,很难知道为什么您想要该特定行,但您可以查找有关 pandas 中索引查找的更多信息。示例:row = df.query("id == 50000")
  3. 给定单行,您希望将行值提取到变量中。如果您为数据框分配了列名,这很容易。您可以将该行视为值的字典。例如。 lat = row['lat']lon = row['long]

【讨论】:

  • 嗨,非常感谢您的回答,只是想补充一点,我的输入文件中没有标题,所以我想浏览所有制表符分隔的行(每行包含我的所有数据想要)并将它们解析为变量,以便我可以将变量添加到地图对象中,该对象代表循环的每次迭代中的地图。所以基本上:1.读取行,2.解析数据,3.打印值。 . 然后又是一样的
  • @FrantisekFaraks - 你明白刚刚发生了什么吗?您对整个问题的缺乏信息被误解了,这个答案对您不起作用。请向我们展示您的输入文件和所需的输出,以获取可重现的示例和更大的上下文(XY 问题的 X 不是 Y)。
【解决方案3】:

您需要为每一行添加的值是否相同,或者是否需要处理该值以确定添加的值?如果一致,您可以简单地使用 pandas 对数据集进行矩阵运算来应用此总和。如果需要逐行处理,则上述解决方案肯定是正确的。如果它是必须逐行添加的变量表,您可以通过将它们全部转储到与数据集对齐的列中,使用 pandas 逐行添加,然后简单地打印出完整的数据框。假设您要添加三列,然后将它们放入一个新列[e]。

df['e'] = df.a + df.b + df.d

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

df['e'] = df.a + df.b + {常数}

然后删除不需要的列(例如上面的 df['a'] 和 df['b'])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多