前言
最近在网上搜了许多关于pandas.DataFrame
的操作说明,都是一些基础的操作,但是这些操作组合起来还是比较费时间去正确操作DataFrame,花了我挺长时间去调整BUG的。我在这里做一些总结,方便你我他。感兴趣的朋友们一起来看看吧。
一、创建DataFrame的简单操作:
1、根据字典创造:
1
2
3
4
5
6
7
8
9
|
In [ 1 ]: import pandas as pd
In [ 3 ]: aa = { 'one' :[ 1 , 2 , 3 ], 'two' :[ 2 , 3 , 4 ], 'three' :[ 3 , 4 , 5 ]}
In [ 4 ]: bb = pd.DataFrame(aa)
In [ 5 ]: bb
Out[ 5 ]:
one three two
0 1 3 2
1 2 4 3
2 3 5 4 `
|
字典中的keys就是DataFrame里面的columns,但是没有index的值,所以需要自己设定,不设定默认是从零开始计数。
1
2
3
4
5
6
7
|
bb = pd.DataFrame(aa,index = [ 'first' , 'second' , 'third' ])
bb
Out[ 7 ]:
one three two
first 1 3 2
second 2 4 3
third 3 5 4
|
2、从多维数组中创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import numpy as np
In [ 9 ]: del aa
In [ 10 ]: aa = np.array([[ 1 , 2 , 3 ],[ 4 , 5 , 6 ],[ 7 , 8 , 9 ]])
In [ 11 ]: aa
Out[ 11 ]:
array([[ 1 , 2 , 3 ],
[ 4 , 5 , 6 ],
[ 7 , 8 , 9 ]])
In [ 12 ]: bb = pd.DataFrame(aa)
In [ 13 ]: bb
Out[ 13 ]:
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
|
从多维数组中创建就需要为DataFrame赋值columns和index,否则就是默认的,很丑的。
1
2
3
4
5
6
7
|
bb = pd.DataFrame(aa,index = [ 22 , 33 , 44 ],columns = [ 'one' , 'two' , 'three' ])
In [ 15 ]: bb
Out[ 15 ]:
one two three
22 1 2 3
33 4 5 6
44 7 8 9
|
3、用其他的DataFrame创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
bb = pd.DataFrame(aa,index = [ 22 , 33 , 44 ],columns = [ 'one' , 'two' , 'three' ])
bb
Out[ 15 ]:
one two three
22 1 2 3
33 4 5 6
44 7 8 9
cc = bb[[ 'one' , 'three' ]].copy()
Cc
Out[ 17 ]:
one three
22 1 3
33 4 6
44 7 9
|
这里的拷贝是深拷贝,改变cc中的值并不能改变bb中的值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
cc[ 'three' ][ 22 ] = 5
bb
Out[ 19 ]:
one two three
22 1 2 3
33 4 5 6
44 7 8 9
cc
Out[ 20 ]:
one three
22 1 5
33 4 6
44 7 9
|
二、DataFrame的索引操作:
对于一个DataFrame来说,索引是最烦的,最易出错的。
1、索引一列或几列,比较简单:
1
2
3
4
5
6
|
bb[ 'one' ]
Out[ 21 ]:
22 1
33 4
44 7
Name: one, dtype: int32
|
多个列名需要将输入的列名存在一个列表里,才是个collerable的变量,否则会报错。
1
2
3
4
5
6
|
bb[[ 'one' , 'three' ]]
Out[ 29 ]:
one three
22 1 3
33 4 6
44 7 9
|
2、索引一条记录或几条记录:
1
2
3
4
5
6
7
8
9
|
bb[ 1 : 3 ]
Out[ 27 ]:
one two three
33 4 5 6
44 7 8 9
bb[: 1 ]
Out[ 28 ]:
one two three
22 1 2 3
|
这里注意冒号是必须有的,否则是索引列的了。
3、索引某几列的变量的某几条记录,这个折磨了我好久:
第一种
1
2
3
4
5
|
bb.loc[[ 22 , 33 ]][[ 'one' , 'three' ]]
Out[ 30 ]:
one three
22 1 3
33 4 6
|
这种不能改变这里面的值,你只是能读值,不能写值,可能和loc()
函数有关:
1
2
3
4
5
6
7
|
bb.loc[[ 22 , 33 ]][[ 'one' , 'three' ]] = [[ 2 , 2 ],[ 3 , 6 ]]
In [ 32 ]: bb
Out[ 32 ]:
one two three
22 1 2 3
33 4 5 6
44 7 8 9
|
第二种:也是只能看
1
2
3
4
5
|
bb[[ 'one' , 'three' ]][: 2 ]
Out[ 33 ]:
one three
22 1 3
33 4 6
|
想要改变其中的值就会报错。
1
2
3
4
5
|
In [ 34 ]: bb[[ 'one' , 'three' ]][: 2 ] = [[ 2 , 2 ],[ 2 , 2 ]]
- c: 1 : SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
F:\Anaconda\lib\site - packages\pandas\core\frame.py: 1999 : SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
return self ._setitem_slice(indexer, value)
|
第三种:可以改变数据的值!!!
Iloc是按照数据的行列数来索引,不算index和columns
1
2
3
4
5
6
7
8
9
10
11
12
|
bb.iloc[ 2 : 3 , 2 : 3 ]
Out[ 36 ]:
three
44 9
bb.iloc[ 1 : 3 , 1 : 3 ]
Out[ 37 ]:
two three
33 5 6
44 8 9
bb.iloc[ 0 , 0 ]
Out[ 38 ]: 1
|
下面是证明:
1
2
3
4
5
6
7
|
bb.iloc[ 0 : 4 , 0 : 2 ] = [[ 9 , 9 ],[ 9 , 9 ],[ 9 , 9 ]]
In [ 45 ]: bb
Out[ 45 ]:
one two three
22 9 9 3
33 9 9 6
44 9 9 9
|
三、在原有的DataFrame上新建一个columns或几个columns
1、什么都不用的,只能单独创建一列,多列并不好使,亲测无效:
1
2
3
4
5
6
7
8
9
|
bb[ 'new' ] = [ 2 , 3 , 4 ]
bb
Out[ 51 ]:
one two three new
22 9 9 3 2
33 9 9 6 3
44 9 9 9 4
bb[[ 'new' , 'new2' ]] = [[ 2 , 3 , 4 ],[ 5 , 3 , 7 ]]
KeyError: "['new' 'new2'] not in index"
|
赋予的list基本就是按照所给index值顺序赋值,可是一般我们是要对应的index进行赋值,想要更高级的赋值就看后面的了。
2、使用字典进行多列按index赋值:
1
2
3
4
5
6
7
8
|
aa = { 33 :[ 234 , 44 , 55 ], 44 :[ 657 , 77 , 77 ], 22 :[ 33 , 55 , 457 ]}
In [ 58 ]: bb = bb.join(pd.DataFrame(aa.values(),columns = [ 'hi' , 'hello' , 'ok' ],index = aa.keys()))
In [ 59 ]: bb
Out[ 59 ]:
one two three new hi hello ok
22 9 9 3 2 33 55 457
33 9 9 6 3 234 44 55
44 9 9 9 4 657 77 77
|
这里aa是一个字典和列表的嵌套,相当于一条记录,使用keys当做index名而不是一般默认的columns名。达到了按index多列匹配的目的。由于dict()
储存是混乱的,之间用dict()
而不给他的index赋值会记录错乱,这一点注意值得注意。
四、删除多列或多记录:
删除列
1
2
3
4
5
6
|
bb.drop([ 'new' , 'hi' ],axis = 1 )
Out[ 60 ]:
one two three hello ok
22 9 9 3 55 457
33 9 9 6 44 55
44 9 9 9 77 77
|
删除记录
1
2
3
4
|
bb.drop([ 22 , 33 ],axis = 0 )
Out[ 61 ]:
one two three new hi hello ok
44 9 9 9 4 657 77 77
|
跟大家分享一篇关于python中pandas.DataFrame对行与列求和及添加新行与列示例,感兴趣的朋友们可以看看。
DataFrame还有很多功能还没有涉及,等以后有涉及到,看完官网的API之后,还会继续分享,everything is ok。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://blog.csdn.net/maliang_1993/article/details/50907983