所以我尝试从一个文件夹中读取所有csv文件然后连接它们以创建一个大的csv(所有文件的结构是相同的),保存并再次读取它.所有这一切都是用熊猫完成的.读取时发生错误.我正在附加下面的代码和错误.
import pandas as pd
import numpy as np
import glob
path =r'somePath' # use your path
allFiles = glob.glob(path + "/*.csv")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
df = pd.read_csv(file_,index_col=None, header=0)
list_.append(df)
store = pd.concat(list_)
store.to_csv("C:\work\DATA\Raw_data\\store.csv", sep=',', index= False)
store1 = pd.read_csv("C:\work\DATA\Raw_data\\store.csv", sep=',')
Run Code Online (Sandbox Code Playgroud)
错误:-
CParserError Traceback (most recent call last)
<ipython-input-48-2983d97ccca6> in <module>()
----> 1 store1 = pd.read_csv("C:\work\DATA\Raw_data\\store.csv", sep=',')
C:\Users\armsharm\AppData\Local\Continuum\Anaconda\lib\site-packages\pandas\io\parsers.pyc in parser_f(filepath_or_buffer, sep, dialect, compression, doublequote, escapechar, quotechar, quoting, skipinitialspace, lineterminator, header, index_col, names, prefix, …Run Code Online (Sandbox Code Playgroud) 我想提起这件事,只是因为它很疯狂.也许韦斯有一些想法.该文件非常规则:1100行x~3M列,数据以制表符分隔,仅由整数0,1和2组成.显然,这不是预期的.
如果我预先填充下面的数据帧,它会占用大约26GB的RAM.
h = open("ms.txt")
header = h.readline().split("\t")
h.close()
rows=1100
df = pd.DataFrame(columns=header, index=range(rows), dtype=int)
Run Code Online (Sandbox Code Playgroud)
系统信息:
欢迎任何想法.
函数签名pandas.read_csv包括以下选项:
read_csv(filepath_or_buffer, low_memory=True, memory_map=False, iterator=False, chunksize=None, ...)
Run Code Online (Sandbox Code Playgroud)
我找不到任何文件low_memory或memory_map标志.我对这些功能是否已实现感到困惑,如果是这样,它们如何工作.
特别,
memory_map:如果实现它是否使用np.memmap,如果是,它将各个列存储为memmap或行.low_memory:它是否指定了cache存储在内存中的内容?DataFrame为memmapped DataFramePS:相关模块的版本
pandas==0.14.0
scipy==0.14.0
numpy==1.8.1
Run Code Online (Sandbox Code Playgroud) 所以我一直在尝试使用 pandasread_csv函数读取内存中的 3.2GB 文件,但我不断遇到某种内存泄漏,我的内存使用量会激增90%+。
所以还有替代方案
我尝试定义dtype以避免将数据作为字符串保留在内存中,但看到了类似的行为。
尝试了 numpy read csv,认为我会得到一些不同的结果,但这绝对是错误的。
尝试逐行阅读遇到了同样的问题,但速度非常慢。
我最近转向 python 3,所以认为那里可能存在一些错误,但在 python2 + pandas 上看到了类似的结果。
有问题的文件是来自 Kaggle 竞赛的 train.csv 文件组 bimbo的 train.csv 文件
系统信息:
RAM: 16GB, Processor: i7 8cores
如果您还想了解其他信息,请告诉我。
谢谢 :)
编辑1:它是一个内存峰值!不是泄漏(对不起,我的错。)
编辑 2:csv 文件示例
Semana,Agencia_ID,Canal_ID,Ruta_SAK,Cliente_ID,Producto_ID,Venta_uni_hoy,Venta_hoy,Dev_uni_proxima,Dev_proxima,Demanda_uni_equil
3,1110,7,3301,15766,1212,3,25.14,0,0.0,3
3,1110,7,3301,15766,1216,4,33.52,0,0.0,4
3,1110,7,3301,15766,1238,4,39.32,0,0.0,4
3,1110,7,3301,15766,1240,4,33.52,0,0.0,4
3,1110,7,3301,15766,1242,3,22.92,0,0.0,3
Run Code Online (Sandbox Code Playgroud)
编辑3:文件中的行数74180465
其他则简单pd.read_csv('filename', low_memory=False)
我努力了
from numpy import genfromtxt
my_data = genfromtxt('data/train.csv', delimiter=',')
Run Code Online (Sandbox Code Playgroud)
更新 下面的代码刚刚工作,但我仍然想弄清楚这个问题的根源,一定有什么问题。
import pandas as pd
import gc
data = pd.DataFrame()
data_iterator = pd.read_csv('data/train.csv', …Run Code Online (Sandbox Code Playgroud) 来自https://pypi.org/project/tqdm/:
import pandas as pd
import numpy as np
from tqdm import tqdm
df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))
tqdm.pandas(desc="my bar!")p`
df.progress_apply(lambda x: x**2)
Run Code Online (Sandbox Code Playgroud)
我接受了这段代码并对其进行了编辑,以便从load_excel创建一个DataFrame而不是使用随机数:
import pandas as pd
from tqdm import tqdm
import numpy as np
filename="huge_file.xlsx"
df = pd.DataFrame(pd.read_excel(filename))
tqdm.pandas()
df.progress_apply(lambda x: x**2)
Run Code Online (Sandbox Code Playgroud)
这给了我一个错误,所以我将df.progress_apply更改为:
df.progress_apply(lambda x: x)
Run Code Online (Sandbox Code Playgroud)
这是最终代码:
import pandas as pd
from tqdm import tqdm
import numpy as np
filename="huge_file.xlsx"
df = pd.DataFrame(pd.read_excel(filename))
tqdm.pandas()
df.progress_apply(lambda x: x)
Run Code Online (Sandbox Code Playgroud)
这会产生一个进度条,但实际上并没有显示任何进度,而是加载进度条,并且当操作完成时,它会跳到100%,无法达到目的。
我的问题是:如何使进度条起作用?
progress_apply内部的函数实际上是做什么的?
有没有更好的方法?也许是tqdm的替代品?
任何帮助是极大的赞赏。
我正在尝试读取 csv 文件
df = pd.read_csv('Salaries.csv')
Run Code Online (Sandbox Code Playgroud)
我有这个:
sys:1: DtypeWarning: 列 (3,4,5,6,12) 具有混合类型。在导入时指定 dtype 选项或设置 low_memory=False。
所以,我尝试过:
df = pd.read_csv('Salaries.csv', sep=',', dtype={
'Id': int,
'EmployeeName': str,
'JobTitle': str,
'BasePay': float,
'OvertimePay': float,
'OtherPay': float,
'Benefits': float,
'TotalPay': np.float64,
'TotalPayBenefits': np.float64,
'Year': np.int64,
'Notes': np.float64,
'Agency': str,
'Status': float})
Run Code Online (Sandbox Code Playgroud)
现在我有这个:
回溯(最近一次调用最后):文件“pandas_libs\parsers.pyx”,第1156行,在pandas._libs.parsers.TextReader._convert_tokens TypeError:无法根据dtype('O')将数组转换为dtype('float64')遵守“安全”规则
我也阅读了之前提出的问题和官方文档,但不明白问题出在哪里。
以下是 Salaries.csv 中的数据示例
ID、员工姓名、职务、基本工资、加班工资、其他工资、福利、总工资、总工资福利、年份、备注、机构、状态
1,纳撒尼尔·福特 (NATHANIEL FORD),大都会交通管理局总经理,167411.18,0.0,400184.25,,567595.43,567595.43,2011,,旧金山,
我有一个 CSV 文件,其中包含多个列,其中包括整数和字符串。当然,由于混合数据类型,我收到了数据类型警告。我用这个通用命令读取了该文件。
df = pd.read_csv(path, sep=";", na_values=missing)
Run Code Online (Sandbox Code Playgroud)
我可以使用low_memory=Falseordtype=object来消除警告,但据我所知,这使得读取我的文件不会提高内存效率。
我也可以使用na_values="my_string",但我有其他缺失值(应该是真正的缺失值)并且不想混合它们。
我不需要字符串的值,只需要它的值计数,所以我想用整数替换它。像这样的东西。
df.replace(to_replace="my_string", value=999)
Run Code Online (Sandbox Code Playgroud)
但是,是否也可以在读取 CSV 文件时替换值?或者是否存在其他解决方案?我不想简单地消除警告,而是找到一种内存效率更高的解决方案。
(我知道这个答案,但它并不能真正帮助我解决我的问题。)
我正在使用以下代码:
df = pd.read_csv('/Python Test/AcquirerRussell3000.csv')
Run Code Online (Sandbox Code Playgroud)
我有以下类型的数据:
18.07.2000 27.1875 0 08.08.2000 25.3125 0.1 05.09.2000 \
0 19.07.00 26.6250 -0.020690 09.08.00 25.2344 -0.003085 06.09.00
1 20.07.00 26.6250 0.000000 10.08.00 25.1406 -0.003717 07.09.00
2 21.07.00 25.6875 -0.035211 11.08.00 25.5781 0.017402 08.09.00
3 24.07.00 26.2500 0.021898 14.08.00 25.4375 -0.005497 11.09.00
4 25.07.00 26.6875 0.016667 15.08.00 25.5625 0.004914 12.09.00
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Pythone Test/untitled0.py:1: DtypeWarning: Columns (long list of numbers) have mixed types.
Specify dtype option on import or set low_memory=False.
Run Code Online (Sandbox Code Playgroud)
所以每第三列是一个日期,其余的都是数字。我想没有单一的数据类型,因为日期是字符串,其余的是浮点数或整数?我有大约 5000 列或更多和大约 400 行。
我见过与此类似的问题,但不太知道如何将其应用于我的数据。此外,我想在堆叠数据帧之后运行以下代码。 …
我正在使用 pandas 将 csv 文件导入到 python 数据框中。PFA 我的代码如下:
import pandas as pd
df=pd.read_csv('C:/Users/Administrator/Desktop/NSE_Normalize.csv')
Run Code Online (Sandbox Code Playgroud)
当我使用上面的代码导入时,没有给出错误,但出现警告,如下所示:
Columns (0,1,3) have mixed types.Specify dtype option on import or set low_memory=False.
Run Code Online (Sandbox Code Playgroud)
通过参考答案Pandas read_csv low_memory and dtype options我开始知道为什么会发生这种情况以及我的文件有不明确的 dtypes。
我能够通过使用来解决这个问题:
df = pd.read_csv("C:/Users/Administrator/Desktop/NSE_Normalize.csv",sep=',', error_bad_lines=False, index_col=False, dtype='unicode') as mentioned on [Specify dtype option on import or set low_memory=False][2]
Run Code Online (Sandbox Code Playgroud)
但是当我导入相同的文件作为 Excel 工作簿(.xlsx 文件)时。不会发生此错误。与 csv 对应项相比,Sure 需要更长的时间才能导入,但不会显示错误。
因此,从上面的讨论中我是否可以知道为什么在 python 中加载 .xlsx 文件的时间比其 .csv 对应的时间长?另外,何时使用 .csv 导入和 .xlsx 导入?
这是我导入的文件:
我.csv从数据帧创建了一个文件,如下所示:
df.to_csv('partial.csv', sep=',')
Run Code Online (Sandbox Code Playgroud)
数据框中的数据类型
df.dtypes给出:
Contact_ID int64
Src_Sys_Cd object
First_Name object
Last_Name object
Src_Sys_Key object
Full_Name object
Office_No object
Mobile object
Email object
dtype: object
Run Code Online (Sandbox Code Playgroud)
当我尝试.csv使用read_csv它读取新创建的文件时,出现错误:
new_df = pd.read_csv('partial.csv')
Run Code Online (Sandbox Code Playgroud)
DtypeWarning:列 (5) 具有混合类型。在导入时指定 dtype 选项或设置 low_memory=False。交互性=交互性,编译器=编译器,结果=结果)
我怎样才能避免这个错误?出现此错误是因为我在to_csvor时做错了什么read_csv吗?