在使用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’