pandas学习笔记

在使用pandas时语法规则是清楚的,但是对于一些细节,例如以Series和DataFrame为遍历对象有什么不同。每次遇到这种问题总是要用一个例子测试一次。索性每次测试都记录下来。

for循环中使用pandas的DataFrame和Series

从下面的例子可以看出对于DataFrame,不可以直接作为遍历对象,否则只会打印columns列表。而Series类型是可以作为遍历对象输出值得。如果要遍历DataFrame对象,可以使用values成员变量。只是这是一个二维数组!还要注意修改for循环遍历对象的值,不会影响原本的值。需要保存在新的位置。

in:
    l1=pd.DataFrame([1,2,3,4,4],columns=['time1'])
    l2=pd.DataFrame([4,4,5,6,7],columns=['time2'])
    l3 = pd.concat([l1,l2],axis=1)
in:
    for i in l1:
        print(i)
out:
    time1
in:        
    for i in l3['time1']:
        print(i)
out:
1
2
3
4
4    
in:    
    for i in l1.values:
        print(i)
out:
[1]
[2]
[3]
[4]
[4]    
in:    
    for i in l3.values:
        print(i)
out:        
[1 4]
[2 4]
[3 5]
[4 6]
[4 7]

DataFrame中index的设置

pandas类似在内存中维护一个关系型数据库,column是属性列,index是主键。但是存在差异,例如index是可以重复的,column也是可以重复的!我们可以使用 df.set_index('column_name') 将任何一列设置为index,原本重复的行也不会合并。在之后使用loc查找时,如果有重复就会返回多行。除了df.set_index('column_name') 之外还可以使用df.reset_index(drop=True) 删除原本的index,添加从0开始的新的索引序号。如果drop赋值为False,原本的索引会作为新的属性,属性名就是index

DataFrame的多表操作

l1=pd.DataFrame([1,2,3,4,4],columns=['time1'])
l2=pd.DataFrame([3,4,5,6,7],columns=['time2'])
l4=pd.DataFrame([3,4,5,6,7],columns=['time1'])
l3 = pd.concat([l1,l2],axis=1)
l4 = pd.merge(l1,l4,how='inner',on=['time1'])
l4.append(l1)

concat可以完成类似numpy中column_stack和row_stack的功能,可以将多个表按行和列拼接起来。和numpy不同之处在于,pandas是有表头和index的。所以不用保证行和列的维度匹配,缺损的元素用np.nan 来代替。

append函数只能完成行的拼接,效果和concat是相似的。

merge可以支持数据库中join操作,也分为‘inner’,‘outer’,‘left’,‘right’四种。以某一属性列为键,合并数据。键是可以重复的,结果是重复列的笛卡尔积。对非键值得属性列名重复的情况,会在不同表的属性名之后添加_x,_y 来区别。

DataFrame中查找元素

查找元素可以使用[], loc[], iloc[] 等多种方式。[] 只能通过属性名查找某一属性列,loc[] 通过index的值和属性名查找,iloc[] 通过index所在的行与列的序号查找。我们可以通过loc[index,column] 查找一个具体的值,也可以用loc[index][column] 的方式。但注意这些查找方式的返回值得类型是变化的。如果查找到的结果只是一个值,那么就会返回这个值。它可能是int, float, str等类型。如果查到一列,那么会返回一个Series,类型名是pandas.core.series.Series 。如果查到一个表,那么会返回一个DataFrame,类型名是pandas.core.frame.DataFrame

DataFrame与一个数的比较

如果DataFrame中只含有数字或者np.nan,这种比较满足正常的大小关系。其中np.nan的任何比较结果都是False。如果DataFrame中含有字符,那么字符所在列就不能参与比较,结果不正常。我在测试中发现,如果这一列含有字符,可以判断是否相等,但在判断大于与小于时的结果是错误的。同样使用如l[l==3]='e' 或者l[l==3]=5 的赋值方式,也要求数据不能含有字符。否则会弹出错误Cannot do inplace boolean setting on mixed-types with a non np.nan value

DataFrame的数据修改

pandas相比于numpy的数据结构,可以包容数字和字符。在数据修改中也可以更改为数字或者字符。我们可以使用loc或者iloc定位某一个位置,使用赋值运算符= 修改这个位置的值。也可以使用条件判断,按条件修改特定的值,例如l[l==3]='e' 。注意使用这种方式前提是,DataFrame中不能含有字符,而且含有字符的DataFrame也不能正确计算与数字的比较结果。面对这种情况我们可以使用replace函数。

df = df.replace(4,'eee')

这个函数会将等于4的项修改为‘eee’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值