csv 如何处理Pandas的负号?

nbysray5  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(118)

当我试图阅读一个.csv文件时,我和Pandas一起旅行,我想和你分享这个文件,希望有人能启发我一些观点。我将用粗体标出我的问题。
我使用Python 3.8.10和Pandas 1.4.4版本。
所以,我有一个.csv数据文件,我想学习如何使用pandas进行操作。数据如下所示:

time;ax;ay;az;p;
0,171323;0,0000;0,0000;0,0000;0,0000;
0,172043;0,0000;0,0000;0,0000;0,0000;
0,201634;0,0000;0,0000;0,0000;996,4016;
0,228448;0,0000;0,0000;0,0000;996,4016;
0,229615;0,1425;−0,0355;−0,0517;996,4016;
0,237640;0,1425;−0,0355;−0,0517;996,4016;
....

如您所见,数据使用分号(;)作为分隔符,逗号(,)作为小数点。此外,我从中获取数据的程序在每行末尾添加了一个额外的分号。因此,我需要加载数据:

df = pd.read_csv("filename.csv", sep=';', decimal=',', usecols=[0,1,2,3,4])

如果我运行print(df.dtypes),我会得到以下输出:

time    float64
ax       object
ay       object
az       object
p       float64
dtype: object

我花了很长时间才明白,问题似乎是数据是用unicode减号u2212(-)制表的。

1.由于某种原因,Pandas不认为这是一个负号,有人知道为什么吗?

我检查了ax、ay和az系列中元素的类型,打印输出为<class 'str'>。接下来的任务是找出一种将这些字符串转换为numpy.float64的方法。调用以下任意一项:

df['ax'] = df['ax'].astype(float)
df['ax'] = pd.to_numeric(df['ax'])
df["ax"] = pd.to_numeric(df["ax"], downcast="float")

无法开箱即用,并产生排序值错误:

ValueError: could not convert string to float: '0,0000'

强迫也无济于事:

df['ax'] = pd.to_numeric(df['ax'], errors='coerce')

因为这只是将所有数据序列值设置为NaN。

2.这里的问题似乎是逗号,对吗?关于如何使用内置方法来实现这一点,有什么提示吗?

所以我需要找到一种方法,将字符串转换为浮点数。我可以通过以下方式实现这一点:

a = []
for i in df["ax"]:
    i = i.replace(',','.')
    i = i.replace(u"\u2212", "-")
    a.append(float(i))

df["ax"] = a

但这感觉有点强迫,我必须为每一列单独做这件事。我试着写了一个方法来实现这一点:

def replace(df,a):
    """Replace a column in df by array a

    :param df: The dataframe column to be replaced
    :param a: Array in which data is saved
    :return: Nothing
    """
    for i in df:
        i = i.replace(',','.')
        i = i.replace(u"\u2212", "-")
        a.append(float(i))

    df = a

但这似乎不起作用。这些值保持不变,但带有有问题的unicode字符u2212。

3.为什么replace方法不起作用,但逐列单独执行这种类型的替换可以起作用?

把所有这些放在一起,一个最小的工作示例是:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

name = 'accelerometer_log.csv'

df = pd.read_csv(name, sep=';', decimal=',', usecols=[0,1,2,3,4])

a = []
for i in df["ax"]:
    i = i.replace(',','.')
    i = i.replace(u"\u2212", "-")
    a.append(float(i))

df["ax"] = a

df.plot(x="time", y="ax")

plt.show()

最后一个问题是:

4.是否有办法简化更换程序?

任何提示或澄清将高度赞赏!谢谢你,谢谢

yjghlzjz

yjghlzjz1#

要读取dataframe并将字符串转换为浮点数,您可以执行以下操作:

# read df from csv
df = pd.read_csv("data.csv", sep=";", dtype=str)
df = df[df.columns[:-1]]

# convert it to floats
df = df.applymap(lambda v: v.replace(",", ".").replace("−", "-")).apply(pd.to_numeric)
print(df)

图纸:

time      ax      ay      az         p
0  0.171323  0.0000  0.0000  0.0000    0.0000
1  0.172043  0.0000  0.0000  0.0000    0.0000
2  0.201634  0.0000  0.0000  0.0000  996.4016
3  0.228448  0.0000  0.0000  0.0000  996.4016
4  0.229615  0.1425 -0.0355 -0.0517  996.4016
5  0.237640  0.1425 -0.0355 -0.0517  996.4016

df.dtypes是:

print(df.dtypes)

time    float64
ax      float64
ay      float64
az      float64
p       float64
dtype: object
f87krz0w

f87krz0w2#

你可以在pandas中加载文件之前编写一个 Package 器来修复它:

from io import StringIO

def fix_minus(filename):
    with open(filename) as f:
        return StringIO(f.read().replace('−', '-'))
    
    
df = (pd.read_csv(fix_minus('filename.csv'), sep=';', decimal=',')
        .iloc[:, :-1]
      )

df

time      ax      ay      az         p
0  0.171323  0.0000  0.0000  0.0000    0.0000
1  0.172043  0.0000  0.0000  0.0000    0.0000
2  0.201634  0.0000  0.0000  0.0000  996.4016
3  0.228448  0.0000  0.0000  0.0000  996.4016
4  0.229615  0.1425 -0.0355 -0.0517  996.4016
5  0.237640  0.1425 -0.0355 -0.0517  996.4016

df.dtypes

time    float64
ax      float64
ay      float64
az      float64
p       float64
dtype: object

相关问题