【问题标题】:Reading delimited file columns as lists, returning rows instead将分隔的文件列作为列表读取,而不是返回行
【发布时间】:2017-12-31 02:33:19
【问题描述】:

我有一个大的 .txt 文件,我想将每一列作为一个列表读取。该文件有 9 列分隔的浮点数,第一行(几千)是:

0.49406565E-323  0.29532530E+003  0.89244837E+001  0.20901651E-002  0.34989878E+001  0.11594090E+000  0.34025716E-001  0.33723126E+001  0.27954433E+000  0.80757378E-001  0.50813056E+001

我正在像这样阅读我的文件:

colnames = ['weight', 'likelihood', 'A_0', 'w_0', 'p_0', 'A_1', 'w_1', 'p_1', 'A_2', 'w_2', 'p_2']
data = pandas.read_csv('data.txt', names=colnames)

weights = data.weight.tolist()
A_0     = data.A_0.tolist()

第一列是权重,其余是参数,我想对所有参数的权重进行加权平均计算。

但如果我打印weights,例如,它会返回整个文件,而weights[0]是文件的第一行。

为了完成,我的加权平均值如下:

weighted_A_0 = numpy.average(A_0, weights=weights)

也许 pandas 和 numpy 有更简洁的方法?

谢谢!

【问题讨论】:

    标签: python list pandas csv weighted-average


    【解决方案1】:

    默认情况下,pd.read_csv 查找逗号分隔,但您可以使用 sep 参数指定分隔符,例如:

    df = pd.read_csv('data.txt', names=colnames, sep='\t')
    

    标签分隔 - 这有帮助吗?


    决赛:

    原来它是 ' ' 分隔的,所以我们让它工作

    df = pd.read_csv('data.txt', names=colnames, sep='\s+')
    

    【讨论】:

    • 不,刚刚试了一下,我得到了完全相同的结果,不过谢谢!
    • 你的文件是用什么分隔的? snipet 看起来像 2 个空格?你试过吗? (sep=' ')
    • 我认为它是制表符分隔的,但使用 (sep = ' ') 它可以工作,但我确实收到此错误:ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
    • a) 这可能没问题,b) 你可以使用sep='\s+',因为它应该做同样的事情。
    • 来自docs:>C 引擎速度更快,而python 引擎目前功能更完善。
    【解决方案2】:

    由于您没有将任何分隔符传递给read_csv 函数,因此它将逗号作为默认分隔符。您的文件 data.txt 不包含任何逗号,因此它将整个数据放入第一列(权重)。

    data = pandas.read_csv('data.txt', names=colnames, delim_whitespace=True)
    

    delim_whitespace : 布尔值,默认为 False

    指定是否 空格(例如 ' ' 或 ' ')将用作 sep。

    相当于设置 sep='\s+'。如果此选项设置为 True,则不应设置任何内容 传入分隔符参数。

    【讨论】:

      【解决方案3】:
      with open(r'C:/input_data.txt') as f:
         lines = f.read().splitlines()
         lines = [line.split() for line in lines]
         #print lines
      labels = [column labels]
      df = pd.DataFrame.from_records(lines , columns=labels)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 2019-07-03
        相关资源
        最近更新 更多