【问题标题】:Ordering a csv file by ascending value when the file is imported via numpy.loadtxt通过 numpy.loadtxt 导入文件时按升序排序 csv 文件
【发布时间】:2021-03-08 18:50:07
【问题描述】:

我正在导入一个 csv 文件,其中每个标题都有一个字符串,字符串内有一个数字。看图;不需要下载电子表格,它只是一个视觉辅助工具。 如您所见,对于每个观察,字符串中都有一个数字,例如“观察:19909”。我想通过增加观察数来重新排序这些数据。波长列应保持原位,但旁边应是带有“观察:#lowest number#”的数据列,并且在数据末尾的最右侧列应具有“观察:#highest number#”。

我已经用这个 python 代码导入了数据:

spectral_data=np.loadtxt(r'C:/Users/Sidharth/Documents/Computing Labs/Project 1/Halpha_spectral_data.csv', delimiter=',', skiprows=2) #importing data file

现在我想通过观察编号升序对spectral_data 中的观察列进行排序。我该怎么做?。不用说,我不能在 Excel 中编辑电子表格。

编辑:我有一些代码可以简单地打印观察数字字符串中的整数,但我不确定是否/如何将其合并到实现问题中的任务中。这是代码:

with open('C:/Users/Sidharth/Documents/Computing Labs/Project 1/Halpha_spectral_data.csv','r') as file:
    line1=file.readline()
    line2=file.readline()
    line1_split=line1.split(',')
    line2_split=line2.split(',')
    str1=('White Space')
    str2=str1.strip()
    
print(line2_split)
observation=line2_split
observation=observation[1:]
print(observation)
observation_int = [int(item.split(' ')[1]) for item in observation]
print(observation_int)

感谢您抽出宝贵时间阅读本文, 席德

【问题讨论】:

    标签: python numpy csv scipy


    【解决方案1】:

    在我看来,一个可以更直观地执行任务的工具 更简单的方法是 Pandas。此外,它还允许您保留列名。

    假设输入文件包含:

    # Date: 19.10.2020
    # Waveler xxx,Observation: 19909,Observation: 19908,Observation: 19912
    6.60E-07,1.24E+02,1.48E+02,1.33E+02
    6.62E-07,1.28E+02,1.35E+02,1.49E+02
    

    您可以将其读入 DataFrame,调用:

    df = pd.read_csv('Input.csv', skiprows=1, index_col=0)
    

    注意 2 重要细节:

    • skiprows=1 导致初始行被跳过(所以列名 从第二行读取数据,从后续行读取数据,
    • index_col=0 导致最左列将是 index 创建的 DataFrame (不是常规列)。原因是 在对列进行排序时省略此列。

    目前,df包含:

                   Observation: 19909  Observation: 19908  Observation: 19912
    # Waveler xxx                                                            
    6.600000e-07                124.0               148.0               133.0
    6.620000e-07                128.0               135.0               149.0
    

    所以前 2 列的顺序错误。

    要对列进行排序,然后将索引更改为常规列, 你可以运行:

    df = df[df.columns.sort_values()].reset_index()
    

    现在 df 包含:

       # Waveler xxx  Observation: 19908  Observation: 19909  Observation: 19912
    0   6.600000e-07               148.0               124.0               133.0
    1   6.620000e-07               135.0               128.0               149.0
    

    ​如果你想要一个 Numpy 数组,而不是 DataFrame,你可以运行:

    arr = df.values
    

    但请注意,现在您丢失了列名(在您的情况下为观察名称)。

    【讨论】:

    • 这是一个很好的解决方案。对于我的使用,最后的 numpy 数组更有用,所以我也感谢您在这方面的投入。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多