回顾Pandas的基本操作,参照morvan tutorial。
anaconda下,直接运行:
conda install pandas
pd.date_range
生成一个list,装着数据结构的行名。
dates = pd.date_range('20200101', periods=5)
"""
output:
DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05'],
dtype='datetime64[ns]', freq='D')
"""
pd.DataFrame
创建一个数据结构(表)
df = pd.DataFrame(np.arange(15).reshape((5,3)), index=dates, columns=['A', 'B', 'C'])
"""
output:
A B C
2020-01-01 0 1 2
2020-01-02 3 4 5
2020-01-03 6 7 8
2020-01-04 9 10 11
2020-01-05 12 13 14
"""
df.A
与df['A']
相同都为:
"""
output:
2020-01-01 0
2020-01-02 3
2020-01-03 6
2020-01-04 9
2020-01-05 12
Freq: D, Name: A, dtype: int32
"""
注意: df['2020-01-01']
和df['20200101']
都是非法的,因为这种语法只针对列。
df[0:2]
输出为第一行到第二行的数据,不是列哦!
"""
output:
A B C
2020-01-01 0 1 2
2020-01-02 3 4 5
"""
df['20200101':'20200103']
输出的是第一行到第三行(包含)的数据。
"""
output:
A B C
2020-01-01 0 1 2
2020-01-02 3 4 5
2020-01-03 6 7 8
"""
df.loc['20200101']
df['20200101':‘20200101’]
这样可以获取第一行的数据,包含了行名。如果只是想获取第一行的数据,不要行名,就可以用df.loc['20200101']
"""
output:
A 0
B 1
C 2
Name: 2020-01-01 00:00:00, dtype: int32
"""
并且还以获取其中的某一列的值:
df.loc['20200101'][0]
"""
output:
0
"""
也可以获得每一列的所有数据:
df.loc[:,['A']]
"""
output:
A
2020-01-01 0
2020-01-02 3
2020-01-03 6
2020-01-04 9
2020-01-05 12
"""
总结一下: 如果行用的索引是’20200101’这样的具体名称,则输出不会含有这个名称了,且可以通过后续索引得到具体的数值,如果是index,则输出一定含有名称了,这样就没办法通过索引来得到数值。
df.iloc[1,1]
"""
output:
4
"""
注意: 只能用index进行索引哦,不能用名称,再举个例子吧:
df.iloc[[1,2],[1,2]]
"""
output:
B C
2020-01-02 4 5
2020-01-03 7 8
"""
df.ix
在我使用的pandas1.0.3版本已经弃用了df.A>5
这个可以筛选出A列中大于5所在的所有行所,True表示选中。
"""
output:
2020-01-01 False
2020-01-02 False
2020-01-03 True
2020-01-04 True
2020-01-05 True
Freq: D, Name: A, dtype: bool
"""
然后可以用这个来在原始的df上进行筛选:
df[df.A>5]
"""
output:
A B C
2020-01-03 6 7 8
2020-01-04 9 10 11
2020-01-05 12 13 14
"""
df.loc['20200101', 'C']=8
更改数值。
如果要整体更改满足某一条件的列,则可以:
df.C[df.A>5]=np.nan
"""
output:
A B C
2020-01-01 0 1 8.0
2020-01-02 3 4 5.0
2020-01-03 6 7 NaN
2020-01-04 9 10 NaN
2020-01-05 12 13 NaN
"""
如果要自定义更改的值,可以:
"""
df.C[df.A>5]=[1,2,3]
output:
A B C
2020-01-01 0 1 8.0
2020-01-02 3 4 5.0
2020-01-03 6 7 1.0
2020-01-04 9 10 2.0
2020-01-05 12 13 3.0
"""
也可以用Series创建一个index to column对,进行赋值:
"""
df.C=pd.Series([1,2,3], index=pd.date_range('20200103', periods=3))
output:
A B C
2020-01-01 0 1 NaN
2020-01-02 3 4 NaN
2020-01-03 6 7 1.0
2020-01-04 9 10 2.0
2020-01-05 12 13 3.0
"""
注意:
1.pd.Series([1,2,3], index=pd.date_range('20200103', periods=3))
生成的就是index to column对
2.因为更改的是整个C列,但是给的值只有后三行对应的,所以其他的空位自动被赋值为NaN
df.dropna(axis=, how= )
如果整行删除,axis=0
如果整列删除,axis=1
如果要全部为NaN才删除,how=‘all’
如果出现NaN就删除,how=‘any’
df.dropna(axis=1, how='any')
"""
output:
A B
2020-01-01 0 1
2020-01-02 3 4
2020-01-03 6 7
2020-01-04 9 10
2020-01-05 12 13
"""
df.fillna(value= )
df.fillna(value=1)
"""
output:
A B C
2020-01-01 0 1 1.0
2020-01-02 3 4 1.0
2020-01-03 6 7 8.0
2020-01-04 9 10 11.0
2020-01-05 12 13 14.0
"""
注意: 尽管我给的value是integer,但是填进去的值被自动转为了与下面相同的float类型
df.isnull
查看哪些是NaN,输出的是bool型,这个输出的是一个DataFrame,包含了索引和名称,所以不能使用这个进行索引哦!
读取csv文件:
csv = pd.read_csv('student.csv')
"""
output:
Student ID name age gender
0 1100 Kelly 22 Female
1 1101 Clo 21 Female
2 1102 Tilly 22 Female
3 1103 Tony 24 Male
4 1104 David 20 Male
5 1105 Catty 22 Female
6 1106 M 3 Female
7 1107 N 43 Male
8 1108 A 13 Male
9 1109 S 12 Male
10 1110 David 33 Male
11 1111 Dw 3 Female
12 1112 Q 23 Male
13 1113 W 21 Female
"""
可以发现,在这个表的左侧,会自动加上一个index行索引哦,方便对数据进行后续操作。
如果想更高效低读取csv文件,可以用csv.to_pickle('student.pickle')
,读取.pickle文件用:
pd.read_pickle()
df1 = pd.DataFrame(np.ones((5,3))*1, columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((5,3))*2, columns=['A', 'B', 'C'])
df3 = pd.DataFrame(np.ones((5,3))*3, columns=['A', 'B', 'C'])
concate = pd.concat([df1, df2, df3], axis=0)
"""
output:
A B C
0 1.0 1.0 1.0
1 1.0 1.0 1.0
2 1.0 1.0 1.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
0 2.0 2.0 2.0
1 2.0 2.0 2.0
2 2.0 2.0 2.0
3 2.0 2.0 2.0
4 2.0 2.0 2.0
0 3.0 3.0 3.0
1 3.0 3.0 3.0
2 3.0 3.0 3.0
3 3.0 3.0 3.0
4 3.0 3.0 3.0
"""
注意:
1.axis默认是0,也就是按行合并
2.如果没有给行命名,则按0开始自动命名,这样很不直观,所以需要重新排序命名:
concate = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
"""
output:
A B C
0 1.0 1.0 1.0
1 1.0 1.0 1.0
2 1.0 1.0 1.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
5 2.0 2.0 2.0
6 2.0 2.0 2.0
7 2.0 2.0 2.0
8 2.0 2.0 2.0
9 2.0 2.0 2.0
10 3.0 3.0 3.0
11 3.0 3.0 3.0
12 3.0 3.0 3.0
13 3.0 3.0 3.0
14 3.0 3.0 3.0
"""
注意一下,join的参数,默认是’outer’:
df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((2,3))*2, index=[0,2], columns=['A', 'B', 'D'])
concate = pd.concat([df1, df2], axis=0, join='outer')
"""
output:
A B C D
0 1.0 1.0 1.0 NaN
1 1.0 1.0 1.0 NaN
0 2.0 2.0 NaN 2.0
2 2.0 2.0 NaN 2.0
"""
没有出现的地方就要补NaN了。
如果是’inner’,则只会合并相同名称的列哦:
df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((2,3))*2, index=[0,2], columns=['A', 'B', 'D'])
concate = pd.concat([df1, df2], axis=0, join='inner')
"""
output:
A B
0 1.0 1.0
1 1.0 1.0
0 2.0 2.0
2 2.0 2.0
"""
当axis=1时:
df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((2,3))*2, index=[0,2], columns=['A', 'B', 'D'])
concate = pd.concat([df1, df2], axis=1, join='inner')
"""
output:
A B C A B D
0 1.0 1.0 1.0 2.0 2.0 2.0
"""
在pandas1.0.3版本中,已经去掉了join_axes了。
还有一种合并的方法是append,这个和python中的列表一样,只能在最后面进行添加,所以只能进行类似axis=0的合并,并且是outer类型的哦:
df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.ones((2,3))*2, index=[0,2], columns=['A', 'B', 'D'])
df1.append([df1, df2], ignore_index=True)
"""
output:
A B C D
0 1.0 1.0 1.0 NaN
1 1.0 1.0 1.0 NaN
2 1.0 1.0 1.0 NaN
3 1.0 1.0 1.0 NaN
4 2.0 2.0 NaN 2.0
5 2.0 2.0 NaN 2.0
"""
注意:
1.append并不会改变df1的东西哦,如果要建新的表,需要另外取个名字,除了这个操作外,其余的操作都会直接改变表中的值。
2.append([df1, df2])
这个是按顺序加入的哦。
或者使用下面一种形式:
df1 = pd.DataFrame(np.ones((2,3))*1, index=[0,1], columns=['A', 'B', 'C'])
new_row = pd.Series([3,4,5], index=['A', 'B', 'C']) # 这里要列命名与df1相同,如果不命名,则得到的结果不正确
df1.append(new_row, ignore_index=True)
"""
output:
A B C
0 1.0 1.0 1.0
1 1.0 1.0 1.0
2 3.0 4.0 5.0
"""
这个与concat类似,但merge主要用于两组有key列数据的合并: