小编Pyt*_*ous的帖子

Python pandas:如何在读取Excel文件时指定数据类型?

我正在使用该pandas.read_excel()函数将excel文件导入到pandas数据框中.

其中一列是表格的主键:它是所有数字,但它以文本形式存储(Excel单元格左上方的小绿色三角形证实了这一点).

但是,当我将文件导入pandas数据帧时,该列将作为float导入.这意味着,例如,'0614'变为614.

有没有办法在导入列时指定数据类型?我知道这在导入CSV文件时是可能的,但在语法中找不到任何内容read_excel().

我能想到的唯一解决方案是在Excel的文本开头添加一个任意字母(将'0614'转换为'A0614'),以确保将列导入为文本,然后切掉'A'在python中,所以我可以将它与我从SQL导入的其他表匹配.

python dataframe pandas

47
推荐指数
6
解决办法
7万
查看次数

pandas:如何使用多索引运行数据透视?

我想在熊猫上运行一个轴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)

python pivot multi-index pandas

40
推荐指数
2
解决办法
4万
查看次数

使用sqlalchemy的python pandas to_sql:如何加快导出到MS SQL?

我有一个大约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)

python sql sqlalchemy pyodbc pandas

21
推荐指数
7
解决办法
2万
查看次数

Python numpy:无法将datetime64 [ns]转换为datetime64 [D](与Numba一起使用)

我想将一个日期时间数组传递给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)

python numpy pandas numba

21
推荐指数
1
解决办法
3万
查看次数

如何获得itertools.product的长度?

我正在使用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!

python python-itertools

13
推荐指数
3
解决办法
7071
查看次数

在没有聚合的情况下在Excel中旋转,以显示文本,而不是数字?

假设我有一个这样的表格:

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中执行数据透视以显示该数字,然后执行查找以获取相关文本,但对于应该真正更容易的事情来说,这似乎是一个相当复杂的过程!

excel pivot pivot-table

12
推荐指数
1
解决办法
8万
查看次数

如何将系列加入DataFrame?

有没有办法直接将系列加入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)

python join dataframe pandas

11
推荐指数
2
解决办法
1万
查看次数

Python:在多个工作表上将pandas DataFrame写入Excel的最快方法

我需要将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,.xlsx5.2 MB

谢谢!

python excel export pandas output

9
推荐指数
1
解决办法
7276
查看次数

ipython笔记本比python慢​​11倍:为什么?

我在ipython笔记本(使用Chrome)中运行脚本,并注意到它比使用spyder作为我的IDE在Python中运行相同的脚本慢11倍.该脚本非常简单:它只是一组pandas数据帧上的循环和计算.没有输出打印到屏幕,也没有写入外部文件.我希望代码变慢,因为它没有矢量化,我很欣赏Ipython可能会涉及一些开销,但是11次......!你能想出任何理由吗?有什么建议?

谢谢!

ipython ipython-notebook

9
推荐指数
1
解决办法
6176
查看次数

python pandas:如何在一个数据帧中查找行而不在另一个数据帧中查找?

假设我有两个表: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的记录,然后删除虚拟字段 - 这看起来有点复杂.

谢谢!

python dataframe pandas

9
推荐指数
2
解决办法
1万
查看次数