我正在使用该pandas.read_excel()
函数将excel文件导入到pandas数据框中.
其中一列是表格的主键:它是所有数字,但它以文本形式存储(Excel单元格左上方的小绿色三角形证实了这一点).
但是,当我将文件导入pandas数据帧时,该列将作为float导入.这意味着,例如,'0614'变为614.
有没有办法在导入列时指定数据类型?我知道这在导入CSV文件时是可能的,但在语法中找不到任何内容read_excel()
.
我能想到的唯一解决方案是在Excel的文本开头添加一个任意字母(将'0614'转换为'A0614'),以确保将列导入为文本,然后切掉'A'在python中,所以我可以将它与我从SQL导入的其他表匹配.
我想在熊猫上运行一个轴DataFrame
,索引是两列,而不是一列.例如,年份的一个字段,月份的一个字段,显示"项目1"和"项目2"的"项目"字段和带有数值的"值"字段.我希望索引是年+月.
我设法让这个工作的唯一方法是将两个字段合并为一个,然后再将它们分开.有没有更好的办法?
下面复制的最小代码.非常感谢!
PS是的,我知道关键字'pivot'和'multi-index'还有其他问题,但我不明白他们是否/如何帮助我解决这个问题.
import pandas as pd
import numpy as np
df= pd.DataFrame()
month = np.arange(1, 13)
values1 = np.random.randint(0, 100, 12)
values2 = np.random.randint(200, 300, 12)
df['month'] = np.hstack((month, month))
df['year'] = 2004
df['value'] = np.hstack((values1, values2))
df['item'] = np.hstack((np.repeat('item 1', 12), np.repeat('item 2', 12)))
# This doesn't work:
# ValueError: Wrong number of items passed 24, placement implies 2
# mypiv = df.pivot(['year', 'month'], 'item', 'value')
# This doesn't work, either:
# df.set_index(['year', 'month'], inplace=True) …
Run Code Online (Sandbox Code Playgroud) 我有一个大约155,000行和12列的数据帧.如果我使用dataframe.to_csv将其导出到csv,则输出为11MB文件(即时生成).
但是,如果我使用to_sql方法导出到Microsoft SQL Server,则需要5到6分钟!没有列是文本:只有int,float,bool和日期.我见过ODBC驱动程序设置nvarchar(max)的情况,这会减慢数据传输速度,但这不是这种情况.
有关如何加快出口流程的任何建议?导出11 MB数据需要6分钟,这使得ODBC连接几乎无法使用.
谢谢!
我的代码是:
import pandas as pd
from sqlalchemy import create_engine, MetaData, Table, select
ServerName = "myserver"
Database = "mydatabase"
TableName = "mytable"
engine = create_engine('mssql+pyodbc://' + ServerName + '/' + Database)
conn = engine.connect()
metadata = MetaData(conn)
my_data_frame.to_sql(TableName,engine)
Run Code Online (Sandbox Code Playgroud) 我想将一个日期时间数组传递给Numba函数(它不能被矢量化,否则会非常慢).我知道Numba支持numpy.datetime64.但是,它似乎支持datetime64 [D](日精度),但不支持datetime64 [ns](毫秒精度)(我学到了很多方法:它是否记录了?).
我试图从datetime64 [ns]转换为datetime64 [D],但似乎无法找到方法!有任何想法吗?
我用下面的最小代码总结了我的问题.如果你运行testdf(mydates)
,这是datetime64 [D],它工作正常.如果你运行testdf(dates_input)
,这是datetime64 [ns],它不会.请注意,此示例只是将日期传递给Numba函数,后者尚未对它们执行任何操作.我尝试将dates_input转换为datetime64 [D],但转换不起作用.在我的原始代码中,我从一个SQL表读入一个pandas数据帧,并需要一个列,将每个日期的日期更改为15日.
import numba
import numpy as np
import pandas as pd
import datetime
mydates =np.array(['2010-01-01','2011-01-02']).astype('datetime64[D]')
df=pd.DataFrame()
df["rawdate"]=mydates
df["month_15"] = df["rawdate"].apply(lambda r: datetime.date( r.year, r.month,15 ) )
dates_input = df["month_15"].astype('datetime64[D]')
print dates_input.dtype # Why datetime64[ns] and not datetime64[D] ??
@numba.jit(nopython=True)
def testf(dates):
return 1
print testf(mydates)
Run Code Online (Sandbox Code Playgroud)
我跑的错误testdf(dates_input)
是:
numba.typeinfer.TypingError: Failed at nopython (nopython frontend)
Var 'dates' unified to object: dates := {pyobject}
Run Code Online (Sandbox Code Playgroud) 我正在使用itertools
迭代我输入参数的所有可能组合的数值模拟.在下面的示例中,我有两个参数和六种可能的组合:
import itertools
x = [0, 1]
y = [100, 200, 300]
myprod = itertools.product(x, y)
for p in myprod:
print p[0], p[1]
# run myfunction using p[0] as the value of x and p[1] as the value of y
Run Code Online (Sandbox Code Playgroud)
如何获得myprod
(示例中的六个)的大小?我需要在for
循环开始之前打印它.
我明白myprod
不是一个清单.我可以计算len(list(myprod))
,但这会消耗迭代器,因此for
循环不再有效.
我试过了:
myprod2=copy.deepcopy(myprod)
mylength = len(list(myprod2))
Run Code Online (Sandbox Code Playgroud)
但这也行不通.我可以:
myprod2=itertools.product(x,y)
mylength = len(list(myprod2))
Run Code Online (Sandbox Code Playgroud)
但它不是优雅和pythonic!
假设我有一个这样的表格:
Country Region Mytext
USA North a
USA South b
Brasil North c
Brasil South d
Run Code Online (Sandbox Code Playgroud)
如何在Excel中获得这样的支点?
Country North South
USA a b
Brasil c d
Run Code Online (Sandbox Code Playgroud)
如果'mytext'是一个数字,我可以做一个数据透视表:因为每个国家和地区组合只有一行,min = max = sum = avg,这些聚合函数中的任何一个实际上都会显示结果我想要.
但是当我想要的字段是非数字时呢?使用Python的pandas库,我甚至可以在非数字字段上使用dataframe.pivot()方法,但我还没有找到在Excel中执行相同操作的方法.我可以将一个数字关联到每一行,在Excel中执行数据透视以显示该数字,然后执行查找以获取相关文本,但对于应该真正更容易的事情来说,这似乎是一个相当复杂的过程!
有没有办法直接将系列加入DataFrame?
连接将位于数据帧的字段和系列的索引上.
我发现的唯一方法是首先将系列转换为数据帧,如下面的代码所示.
import numpy as np
import pandas as pd
df = pd.DataFrame()
df['a'] = np.arange(0, 4)
df['b'] = np.arange(100, 104)
s = pd.Series(data=np.arange(100, 103))
# this doesn't work
# myjoin = pd.merge(df, s, how='left', left_on='a', right_index=True)
# this does
s = s.reset_index()
# s becomes a Dataframe
# note you cannot reset the index of a series inplace
myjoin = pd.merge(df, s, how='left', left_on='a', right_on='index')
print myjoin
Run Code Online (Sandbox Code Playgroud) 我需要将24个pandas数据框(140列x 400行)导出到Excel,每个都放到不同的工作表中.
我正在使用熊猫的内置功能ExcelWriter
.运行24个场景,需要:
写入.xls
文件51秒(使用xlwt
)
写入.xlsx
文件86秒(使用XlsxWriter
)
141秒写入.xlsm
文件(使用openpyxl
)
只运行程序21秒(无Excel输出)
写入的问题.xls
是电子表格不包含格式化样式,因此如果我在Excel中打开它,选择一个列,然后单击"逗号"按钮来格式化数字,它告诉我:"未找到样式逗号".我没有把这个问题写到一个.xlsx
,但这甚至更慢.
有关如何使出口更快的任何建议?我不能成为第一个遇到这个问题的人,但经过几个小时的搜索论坛和网站,我还没有找到任何明确的解决方案.
我唯一能想到的是使用Python导出到csv文件,然后编写一个Excel宏来将所有CSV合并到一个电子表格中.
该.xls
文件是10 MB,.xlsx
5.2 MB
谢谢!
我在ipython笔记本(使用Chrome)中运行脚本,并注意到它比使用spyder作为我的IDE在Python中运行相同的脚本慢11倍.该脚本非常简单:它只是一组pandas数据帧上的循环和计算.没有输出打印到屏幕,也没有写入外部文件.我希望代码变慢,因为它没有矢量化,我很欣赏Ipython可能会涉及一些开销,但是11次......!你能想出任何理由吗?有什么建议?
谢谢!
假设我有两个表:people_all
并且people_usa
都具有相同的结构,因此具有相同的主键.
我怎样才能得到一张不在美国的人的表?在SQL中我会做类似的事情:
select a.*
from people_all a
left outer join people_usa u
on a.id = u.id
where u.id is null
Run Code Online (Sandbox Code Playgroud)
什么是Python等价物?我想不出把这个where语句翻译成pandas语法的方法.
我能想到的唯一方法是向people_usa(例如people_usa['dummy']=1
)添加一个任意字段,进行左连接,然后只获取'dummy'为nan的记录,然后删除虚拟字段 - 这看起来有点复杂.
谢谢!