我开始用这个撕掉我的头发 - 所以我希望有人可以帮忙.我有一个使用openpyxl从Excel电子表格创建的pandas DataFrame.生成的DataFrame看起来像:
print image_name_data
id image_name
0 1001 1001_mar2014_report
1 1002 1002_mar2014_report
2 1003 1003_mar2014_report
[3 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)
...具有以下数据类型:
print image_name_data.dtypes
id float64
image_name object
dtype: object
Run Code Online (Sandbox Code Playgroud)
问题是id列中的数字实际上是标识号,我需要将它们视为字符串.我尝试使用以下命令将id列转换为字符串:
image_name_data['id'] = image_name_data['id'].astype('str')
Run Code Online (Sandbox Code Playgroud)
这看起来有点难看但它确实产生了'object'类型的变量而不是'float64':
print image_name_data.dyptes
id object
image_name object
dtype: object
Run Code Online (Sandbox Code Playgroud)
但是,创建的字符串具有小数点,如下所示:
print image_name_data
id image_name
0 1001.0 1001_mar2014_report
1 1002.0 1002_mar2014_report
2 1003.0 1003_mar2014_report
[3 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)
如何将pandas DataFrame中的float64列转换为具有给定格式的字符串(在本例中为'%10.0f')?
我有一个数据框可以简化为:
date id
0 02/04/2015 02:34 1
1 06/04/2015 12:34 2
2 09/04/2015 23:03 3
3 12/04/2015 01:00 4
4 15/04/2015 07:12 5
5 21/04/2015 12:59 6
6 29/04/2015 17:33 7
7 04/05/2015 10:44 8
8 06/05/2015 11:12 9
9 10/05/2015 08:52 10
10 12/05/2015 14:19 11
11 19/05/2015 19:22 12
12 27/05/2015 22:31 13
13 01/06/2015 11:09 14
14 04/06/2015 12:57 15
15 10/06/2015 04:00 16
16 15/06/2015 03:23 17
17 19/06/2015 05:37 18
18 23/06/2015 13:41 19
19 …Run Code Online (Sandbox Code Playgroud) 就在我认为自己已经掌握了Python和Pandas的时候,另一个看似简单的问题就出现了.我想将元组添加到pandas数据帧的特定单元格中.这些元组需要根据数据帧中其他单元格的内容即时计算 - 换句话说,我不能提前计算所有元组并将它们添加为单个数组.
举个例子,我用一些数据定义一个数据帧并添加几个空列:
import pandas as pd
import bumpy as np
tempDF = pd.DataFrame({'miscdata': [1.2,3.2,4.1,2.3,3.3,2.5,4.3,2.5,2.2,4.2]})
tempDF['newValue'] = np.nan
tempDF['newTuple'] = np.nan
Run Code Online (Sandbox Code Playgroud)
我可以滚动浏览'newValue'列的每个单元格并添加一个没有问题的整数值:
anyOldValue = 3.5
for i in range(10):
tempDF.ix[(i,'newValue')] = anyOldValue
print tempDF
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试添加元组,我会收到一条错误消息:
anyOldTuple = (2.3,4.5)
for i in range(10):
tempDF.ix[(i,'newTuple')] = anyOldTuple
print tempDF
Run Code Online (Sandbox Code Playgroud)
我收到了几条错误消息,包括:
ValueError: Must have equal len keys and value when setting with an ndarray
Run Code Online (Sandbox Code Playgroud)
…和…
ValueError: setting an array element with a sequence.
Run Code Online (Sandbox Code Playgroud)
我确定我已经在单元格中看到了带有元组(或列表)的数据框 - 不是吗?任何有关如何使此代码工作的建议将非常感激.
我有一个包含大量变量的 Pandas 数据框。这可以简化为:
tempDF = pd.DataFrame({ 'var1': [12,12,12,12,45,45,45,51,51,51],
'var2': ['a','a','b','b','b','b','b','c','c','d'],
'var3': ['e','f','f','f','f','g','g','g','g','g'],
'var4': [1,2,3,3,4,5,6,6,6,7]})
Run Code Online (Sandbox Code Playgroud)
如果我想选择数据帧的一个子集(例如 var2='b' 和 var4=3),我会使用:
tempDF.loc[(tempDF['var2']=='b') & (tempDF['var4']==3),:]
Run Code Online (Sandbox Code Playgroud)
但是,如果匹配条件存储在字典中,是否可以选择数据帧的子集,例如:
tempDict = {'var2': 'b','var4': 3}
Run Code Online (Sandbox Code Playgroud)
重要的是变量名称不是预定义的,并且字典中包含的变量数量是可变的。
我一直对此感到困惑一段时间,因此任何建议将不胜感激。
我有一个用户定义的函数,它使用pymysql连接到mysql数据库,然后它询问数据库并将结果读入Pandas数据帧.
import pandas as pd
import pymysql
import getpass
def myGetData(myQuery):
myServer = 'xxx.xxx.xxx.xxx'
myUser = input("Enter MySQL database username: ")
myPwd = getpass.getpass("Enter password: ")
myConnection = pymysql.connect(host=myServer,user=myUser,password=myPwd)
myTempDF = pd.io.sql.read_sql(myQuery, con=myConnection)
myConnection.close()
return myTempDF
myDF = myGetData("SELECT * FROM `myDB`.`myTable`")
Run Code Online (Sandbox Code Playgroud)
我已经编写了代码来捕获pymysql.connect()引起的异常,尽管为了清楚起见我没有在这里显示它.我还希望能够捕获read_sql()可能产生的任何异常.我在哪里可以找到可能引发的异常列表?它不在Pandas文档中(http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.read_sql.html),我在网上找不到任何提示.我可以捕获所有异常,但这似乎通常被Python社区所厌恶.我应该如何捕获read_sql()引发的异常?
编辑
我已经做了更多的工作,似乎即使我知道正在生成什么错误,也不是直截了当地捕获异常.因此,例如,在上面给出的代码中,如果我错误地输入用户名和/或密码,则会生成操作错误.最后一行或错误报告的内容如下:
OperationalError: (1045, "Access denied for user 'yyy'@'xxx.xxx.xxx.xxx' (using password: YES)")
Run Code Online (Sandbox Code Playgroud)
我已经能够使用以下方法捕获此错误:
try:
phjConnection = pymysql.connect(host=phjServer, user=phjUser, password=phjPwd)
except pymysql.OperationalError as e:
print("\nAn OperationalError occurred. Error number {0}: {1}.".format(e.args[0],e.args[1]))
Run Code Online (Sandbox Code Playgroud)
这工作正常(虽然发现需要使用pymysql.OperationalError捕获的OperationalError是偶然的).
现在,在函数的下一部分中,Pandas函数real_sql()使用上面创建的连接来运行SQL查询.如果我包含一个故意不正确的查询,其表名不正确,则会发生另一个OperationalError,然后是DatabaseError:
OperationalError: (1142, "SELECT …Run Code Online (Sandbox Code Playgroud) 我想使用数据透视表来汇总数据集,然后能够访问数据透视表中的信息,就像它是一个DataFrame一样.
考虑一个分层数据集,患者在医院和位于地区的医院接受治疗:
import pandas as pd
example_data = {'patient' : ['p1','p2','p3','p4','p5','p6','p7','p8','p9','p10','p11','p12','p13','p14','p15','p16','p17','p18','p19','p20','p21','p22','p23','p24','p25','p26','p27','p28','p29','p30','p31','p32','p33','p34','p35','p36','p37','p38','p39','p40','p41','p42','p43','p44','p45','p46','p47','p48','p49','p50','p51','p52','p53','p54','p55','p56','p57','p58','p59','p60','p61','p62','p63'],
'hospital' : ['h1','h1','h1','h2','h2','h2','h2','h3','h3','h3','h3','h3','h4','h4','h4','h4','h4','h4','h5','h5','h5','h5','h5','h5','h5','h6','h6','h6','h6','h6','h6','h6','h6','h7','h7','h7','h7','h7','h7','h7','h7','h7','h8','h8','h8','h8','h8','h8','h8','h8','h8','h8','h9','h9','h9','h9','h9','h9','h9','h9','h9','h9','h9'],
'region' : ['r1','r1','r1','r1','r1','r1','r1','r1','r1','r1','r1','r1','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r2','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3','r3'] }
example_dataframe = pd.DataFrame(example_data)
print example_dataframe
Run Code Online (Sandbox Code Playgroud)
这产生如下的简单输出:
hospital patient region
0 h1 p1 r1
1 h1 p2 r1
2 h1 p3 r1
3 h2 p4 r1
4 h2 p5 r1
5 h2 p6 r1
6 h2 p7 r1
7 h3 p8 r1
8 h3 p9 r1
9 h3 p10 r1
10 h3 p11 r1
11 h3 p12 r1
12 h4 p13 r2
13 …Run Code Online (Sandbox Code Playgroud) 我认为这应该很容易,但我有点像墙了.我有一个数据集从Stata .dta文件导入到pandas数据框中.其中一些列包含日期数据.数据框包含100,000多行,但给出了一个示例:
cat event_date total
0 G2 2006-03-08 16
1 G2 NaT NaN
2 G2 NaT NaN
3 G3 2006-03-10 16
4 G3 2006-08-04 12
5 G3 2006-12-28 13
6 G3 2007-05-25 10
7 G4 2006-03-10 13
8 G4 2006-08-06 19
9 G4 2006-12-30 16
Run Code Online (Sandbox Code Playgroud)
数据存储为datetime64格式:
>>> mydata[['cat','event_date','total']].dtypes
cat object
event_date datetime64[ns]
total float64
dtype: object
Run Code Online (Sandbox Code Playgroud)
我想要做的就是创建一个新列,它在event_date和开始日期之间(例如2006-01-01)给出了天数(而不是'us'或'ns'!!!)的差异.我尝试过以下方法:
>>> mydata['new'] = mydata['event_date'] - np.datetime64('2006-01-01')
Run Code Online (Sandbox Code Playgroud)
......但我收到的消息是:
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely …Run Code Online (Sandbox Code Playgroud) 我有一个pandas数据帧,具有以下结构:
import numpy as np
import pandas as pd
myData = pd.DataFrame({'x': [1.2,2.4,5.3,2.3,4.1], 'y': [6.7,7.5,8.1,5.3,8.3], 'condition':[1,1,np.nan,np.nan,1],'calculation': [np.nan]*5})
print myData
calculation condition x y
0 NaN 1 1.2 6.7
1 NaN 1 2.4 7.5
2 NaN NaN 5.3 8.1
3 NaN NaN 2.3 5.3
4 NaN 1 4.1 8.3
Run Code Online (Sandbox Code Playgroud)
我想根据'x'和'y'(例如x/y)中的值在'calculation'列中输入一个值,但仅限于'condition'列包含NaN的那些单元格中(np.isnan(myData [ 'condition']).最终的数据框应如下所示:
calculation condition x y
0 NaN 1 1.2 6.7
1 NaN 1 2.4 7.5
2 0.654 NaN 5.3 8.1
3 0.434 NaN 2.3 5.3
4 NaN 1 4.1 8.3 …Run Code Online (Sandbox Code Playgroud) 我对数据库进行只读访问,我使用pymssql查询并读入Pandas数据帧.其中一个变量包含日期,其中一些日期存储在0001年1月1日午夜(即0001-01-01 00:00:00.0000000).我不知道为什么要包含这些日期 - 据我所知,它们不被SQL Server认可为有效日期,它们可能是由于某些默认数据输入.然而,这就是我必须要做的事情.这可以重新创建为数据帧,如下所示:
import numpy as np
import pandas as pd
tempDF = pd.DataFrame({ 'id': [0,1,2,3,4],
'date': ['0001-01-01 00:00:00.0000000',
'2015-05-22 00:00:00.0000000',
'0001-01-01 00:00:00.0000000',
'2015-05-06 00:00:00.0000000',
'2015-05-03 00:00:00.0000000']})
Run Code Online (Sandbox Code Playgroud)
数据框如下所示:
print(tempDF)
date id
0 0001-01-01 00:00:00.0000000 0
1 2015-05-22 00:00:00.0000000 1
2 0001-01-01 00:00:00.0000000 2
3 2015-05-06 00:00:00.0000000 3
4 2015-05-03 00:00:00.0000000 4
Run Code Online (Sandbox Code Playgroud)
...使用以下dtypes:
print(tempDF.dtypes)
date object
id int64
dtype: object
print(tempDF.dtypes)
Run Code Online (Sandbox Code Playgroud)
但是,我经常使用以下方法将数据框中的日期字段转换为日期时间格式:
tempDF['date'] = pd.to_datetime(tempDF['date'])
Run Code Online (Sandbox Code Playgroud)
但是,我偶然发现0001-01-01的日期转换为2001-01-01.
print(tempDF)
date id
0 2001-01-01 0
1 2015-05-22 1
2 2001-01-01 2
3 …Run Code Online (Sandbox Code Playgroud) 我有一个包含一列float64值的Pandas数据帧:
tempDF = pd.DataFrame({ 'id': [12,12,12,12,45,45,45,51,51,51,51,51,51,76,76,76,91,91,91,91],
'measure': [3.2,4.2,6.8,5.6,3.1,4.8,8.8,3.0,1.9,2.1,2.4,3.5,4.2,5.2,4.3,3.6,5.2,7.1,6.5,7.3]})
Run Code Online (Sandbox Code Playgroud)
我想创建一个只包含整数部分的新列.我的第一个想法是使用.astype(int):
tempDF['int_measure'] = tempDF['measure'].astype(int)
Run Code Online (Sandbox Code Playgroud)
这工作正常,但作为一个额外的复杂,我有一列缺少值:
tempDF.ix[10,'measure'] = np.nan
Run Code Online (Sandbox Code Playgroud)
此缺失值导致.astype(int)方法失败:
ValueError: Cannot convert NA to integer
Run Code Online (Sandbox Code Playgroud)
我以为我可以在数据列中舍入浮点数.但是,.round(0)函数将舍入到最接近的整数(更高或更低)而不是向下舍入.我找不到一个等效于".floor()"的函数,它将作用于Pandas数据帧的一列.
有什么建议?
pandas ×10
python ×10
dataframe ×7
datetime ×2
datetime64 ×1
format ×1
mysql ×1
numpy ×1
pivot-table ×1
pymysql ×1
python-3.x ×1
rounding ×1
string ×1
tuples ×1