当我试图阅读一个.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.是否有办法简化更换程序?
任何提示或澄清将高度赞赏!谢谢你,谢谢
2条答案
按热度按时间yjghlzjz1#
要读取dataframe并将字符串转换为浮点数,您可以执行以下操作:
图纸:
df.dtypes
是:f87krz0w2#
你可以在pandas中加载文件之前编写一个 Package 器来修复它:
df
:df.dtypes
: