如何在python中使用pandas read_csv自动跳过具有非浮点值的行?
我有数千个如何在python中使用pandas read_csv自动跳过具有非浮点值的行?,python,pandas,file,Python,Pandas,File,我有数千个.csv文件,其中包含大量的感官数据,都是浮点数。但某些文件中也有一些行显示日期和时间信息,并显示在文件的不同位置,如下图所示: 在上图中,前两行位于开头,但对于其他文件,可以位于其他位置。使用pandasread\u csv函数读取文件时,应跳过此类非浮动行,以避免错误 我使用了skiprows函数跳过固定行索引中的特定行,但问题是不需要的行在文件中的位置是可变的 范围内j的(len(所有列表)): path=os.path.join(path,all_list[j]) #打印(路
.csv
文件,其中包含大量的感官数据,都是浮点数。但某些文件中也有一些行显示日期和时间信息,并显示在文件的不同位置,如下图所示:
在上图中,前两行位于开头,但对于其他文件,可以位于其他位置。使用pandasread\u csv
函数读取文件时,应跳过此类非浮动行,以避免错误
我使用了skiprows
函数跳过固定行索引中的特定行,但问题是不需要的行在文件中的位置是可变的
范围内j的(len(所有列表)):
path=os.path.join(path,all_list[j])
#打印(路径)
df_data=pd.read_csv(路径,skiprows=[0,1],标题=None)
打印(“数据形状:”,df_data.shape)
我的问题是:
如何仅读取基于浮动的行并自动跳过所有文件中的非浮动数据?您可以将csv作为文本加载,删除不需要的行并使用熊猫读取:
for j in range(len(all_list)):
path = os.path.join(path, all_list[j])
# print(path)
with open(path) as f:
l=f.readlines()
l=[x[:-1].split(',') for x in l if '$' not in x]
df_data = pd.DataFrame(l, columns=['A', 'B', 'C'])
print("data shape: ", df_data.shape)
我添加了如果
“$”不在x
中作为不需要的行的过滤器,如果它不够,您需要替换它。如果您的数据不包含缺少的值(或者如果它们将被删除),您可以使用read_csv
的转换器功能,如
import pandas as pd
# read csv
df_data = pd.read_csv(path, header=None)
# parse to numeric and set invalid values to NaN
df_data = df_data.apply(pd.to_numeric, errors='coerce')
# drop rows that contain NaN values
df_data = df_data.dropna()
def conv(x):
尝试:
返回浮动(x)
除:
一无所获
以及随后的.dropna()
。如果考虑到NA
s,您可以使用不同的信号值,通过一些布尔索引魔法返回并过滤掉这些值导入到pandas.read_csv
时,您可以给出任意/固定的标题名,然后处理数据帧以删除所有非浮点值
给定数据:
输出:
最后,您可以调整标题。您可能需要使用pythoncsv
模块并遍历每一行。是的,性能对我们很重要,因为我们有数千个文件。您的答案是迭代读取所有行,然后写入它们,但这会降低性能。还有其他想法吗?我改进了我的解决方案的性能,它现在直接从列表中加载数据帧。请再次检查不要使用。readlines
直接在文件对象上迭代。此外,我非常确定您的pandas dataframe将具有错误的dtypesYeah,此解决方案适合我。谢谢。如果read_csv()有一个errors='concure',我会很高兴的,但这几乎一样好。显然,假设您的整个数据帧是数字的。
import pandas as pd
sample_csv=pd.read_csv('USERS.CSV',names=[X','Y','Z'], index_col=False)
def is_float(x):
try:
float(x)
except ValueError:
return False
return True
sample_csv[sample_csv.applymap(lambda x: is_float(x))].dropna()