小编use*_*097的帖子

如何将pandas数据框的数据类型更改为具有已定义格式的字符串?

我开始用这个撕掉我的头发 - 所以我希望有人可以帮忙.我有一个使用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')?

python string format floating-point pandas

22
推荐指数
2
解决办法
12万
查看次数

更改pandas datetime64列的时间组件

我有一个数据框可以简化为:

                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 datetime dataframe pandas

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

将元组添加到pandas数据帧的特定单元格中

就在我认为自己已经掌握了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)

我确定我已经在单元格中看到了带有元组(或列表)的数据框 - 不是吗?任何有关如何使此代码工作的建议将非常感激.

python tuples dataframe pandas

7
推荐指数
1
解决办法
4307
查看次数

根据存储在字典中的条件从 Pandas 数据框中选择数据

我有一个包含大量变量的 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)

重要的是变量名称不是预定义的,并且字典中包含的变量数量是可变的。

我一直对此感到困惑一段时间,因此任何建议将不胜感激。

python dataframe pandas

7
推荐指数
1
解决办法
2072
查看次数

可以从Pandas read_sql()返回什么异常

我有一个用户定义的函数,它使用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)

python mysql python-3.x pandas pymysql

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

如何将pandas数据透视表转换为数据帧

我想使用数据透视表来汇总数据集,然后能够访问数据透视表中的信息,就像它是一个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)

python pivot-table pandas

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

使用日期的pandas数据帧中的列算法

我认为这应该很容易,但我有点像墙了.我有一个数据集从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)

python dataframe pandas datetime64

6
推荐指数
1
解决办法
1979
查看次数

pandas数据帧中的条件列算法

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

python numpy dataframe pandas

6
推荐指数
1
解决办法
6171
查看次数

如何防止pandas.to_datetime()函数将0001-01-01转换为2001-01-01

我对数据库进行只读访问,我使用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)

python datetime dataframe pandas

6
推荐指数
1
解决办法
671
查看次数

使用NaN舍入Pandas数据帧列中的值

我有一个包含一列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数据帧的一列.

有什么建议?

python rounding dataframe pandas

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