【问题标题】:dividing csv row numbers in columns separated by comma and space将 csv 行号划分为用逗号和空格分隔的列
【发布时间】:2023-04-08 00:41:01
【问题描述】:

我有两种类型的 csv 文件,它们都有几行,但有时用空格分隔,有时用逗号分隔。对于逗号情况,我没有发现将它们添加到 DataFrame 的问题,但我在空格情况下确实有问题,我在下面的代码中引入了文件链接。 ex1.csv 用逗号隔开,ex2.csv 用空格隔开。

https://1drv.ms/f/s!AgQ59n47uloFzSPbIlS9RhRNfZ1p

import os
import pandas as pd
import numpy as np
import openpyxl as pyx
import numpy as np

x=[]
y=[]
z=[]
Rx=[]
Ry=[]
Rz=[]
atot=[]

t=[]

f = io.open(file, mode="r", encoding="utf-8")

lines=f.readlines()

for i in lines:
    try:
        a=[i.strip('\n')]
        a1=[float(n) for n in a[0].split(',')]

            t.append(a1[1])
            x.append(a1[4])
            y.append(a1[3])
            z.append(a1[2])
            Rx.append(a1[7])
            Ry.append(a1[6])
            Rz.append(a1[5])

        except :
            a=[i.split('\n')]
            a1=[float(n) for n in a[0].split()]
            x.append(a1[3])
            y.append(a1[2])
            z.append(a1[1])
            Rx.append(a1[6])
            Ry.append(a1[5])
            Rz.append(a1[4])

上面:如果分隔符是逗号,我会得到错误 'list' 对象没有属性 'split' 这是因为 a 是以这种方式读取的:

a= [['\ufeff     -1.3053      2.2743     -5.0045      0.0121      0.1814     -0.0285      0.0000      0.0000',
  '']]

我添加了一点,我事先将包含逗号的行分开(后面的行以这种方式除外,它分离得很好,但是在尝试将其添加到 DataFrame 时,它​​让我犯了错误:

            t.append(i.split()[0]);
            x.append(i.split()[3]);
            y.append(i.split()[2]);
            z.append(i.split()[1]);
            Rx.append(i.split()[6]);
            Ry.append(i.split()[5]);
            Rz.append(i.split()[4]);

添加点到DataFrame的添加是这样完成的:

df1 = pd.DataFrame(list(zip(x, y, z, Rx, Ry, Rz)), columns=['x', 'y', 'z', 'Rx' , 'Ry', 'Rz'])

for i in df1.columns:
    mylist+=(list(df1.loc[df1[i].argmax()]))
for i in df1.columns:
    mylist+=(list(df1.loc[df1[i].argmin()]))

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    Pandas 有一个非常强大的方法pd.read_csv(...),它解决了读取各种 csv 文件时的大部分麻烦。也许我错过了一些阻止您使用pd.read_csv(...) 的关键问题,但以下代码应该作为概念证明。

    df1 = pd.read_csv("ex1.csv", sep=",", header=None)
    df1.columns = ["t", "atot", 'x', 'y', 'z', 'Rx', 'Ry', 'Rz']
    print(df1)
    
    df2 = pd.read_csv("ex2.csv", sep=" ", header=None) 
    df2 = df2.dropna(axis=1)  # Eliminate the columns that were created because of multiple spaces as separators
    df2.columns = ["t", "atot", 'x', 'y', 'z', 'Rx', 'Ry', 'Rz']
    print(df2)
    

    我认为通常不应将 csv 损坏作为逐行读取 csv 文件的理由。

    如果您以后需要单独的列作为列表,您可以随时创建它们,如下所示:

    X = df2['x'].values.tolist()
    Rx = df2['Rx'].values.tolist()
    

    但是,您应该避免使用过多的变量,您可能已经知道了。另外,从你的原始代码来看,感觉你应该花更多的时间来征服 Pandas 的基础知识,例如:here。有一点学习曲线,但它会在以后为您节省很多痛苦。

    【讨论】:

    • 非常感谢!只是一些问题:我的问题中没有包含“atot”,但在我自己的代码中完全使用了它!你在哪里看到的?
    • 还有:您是如何发现 ex2 中有多个空格的?您是否必须运行一次并出现错误?
    • 我还添加了我之前打开 csv 的方式,io.open,这是我在长时间搜索后发现的!我将其添加为更多信息
    • 还有一个问题:考虑到我需要 x,y,z 的每一列...稍后处理和写入单独的文件,我该怎么做?
    • 多个空格:您可以使用 Excel 来调查数据,以便更好地了解它。要列出的列:查看编辑。
    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多