这个系列是看 https://github.com/yeayee/joyful-pandas 的笔记。
拿到数据----读取数据----读取到了数据得到的是怎样的数据对象?
主要操作:索引,分组,…,合并操作
学习方式:任务驱动型学习
可以读取csv格式,txt格式,xls或xlsx格式的文件
df = pd.read_csv(r'data\table.csv') # 读取文件,得到df对象
print(df.head)
如果读取文件时遇到和列数不对应的行,此时会报错。若报错行可以忽略,添加以下参数:
pandas.read_csv(***,error_bad_lines=False)
df_txt = pd.read_table(r'data\table.txt')
print(df_txt)
df_excel = pd.read_excel('data/table.xlsx')
print(df_excel.head())
将pandas里面的文件对象写入成 外部文件格式.
可以写入成csv格式,xls或xlsx格式.
df.to_csv('data/new_table.csv') # 默认index=True,是有带行索引的
# df.to_csv('data/mew_table.csv', index=False) # 写入不带行索引
df.to_excel('data/new_table2.xlsx', sheet_name='sheet1') # 还可以命名sheet
**a.创建一个series 对象: **
series对象最常用的属性是values,index,name,dtype。
values: 就是series里的数据,index: 行索引,name: 这个series的名字,dtype:数据类型。
s1 = pd.Series(np.random.randn(5))
print(s1)
0 -0.255273
1 -1.413714
2 -0.728769
3 0.261680
4 -0.356917
dtype: float64
s1 = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'],name='my series')
print(s1)
# 使用字典创建Series
s = pd.Series({'first name': 'Michale', 'last name': 'Flemming', 'age': 7})
print(s)
a -0.546030
b 0.196577
c -0.433328
d -0.298501
e 0.599840
Name: my series, dtype: float64
b.访问series数据类型:
就是可以访问前面提到的series的values,name,index,dtype
注意:这里s1.values是一个ndarray。
print(s1.values, s1.name, s1.index, s1.dtype, sep='\n')
[-0.26455693 0.2447298 0.45488016 0.17527088 0.98411053]
my series
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
float64
c.取出某一个元素
print(s1['a'])
0.4812269481502948
d.调用方法
print(s1.mean())
0.20148419138305326
查看一下series对象所有的方法:
print([meth for meth in dir(s1) if not meth.startswith('__')])
结果不列出来了,太多了。
a.创建一个DataFram对象
数据是用字典传入,列索引就是字典的键,行索引也是自己设置的。
index 和 每列的值 都可以使用 python list 来设置。
df = pd.DataFrame({'col1': list('abcde'), 'col2': range(5, 10), 'col3': [1.3, 2.5, 3.6, 3.2, 8]},
index=list('一二三四五'))
col1 col2 col3
一 a 5 1.3
二 b 6 2.5
三 c 7 3.6
四 d 8 3.2
五 e 9 8.0
b.取出一列称为Series
print(df['col1'])
print(type(df), type(df['col1']))
取一列:
一 a
二 b
三 c
四 d
五 e
Name: col1, dtype: object
<class 'pandas.core.frame.DataFrame'> <class 'pandas.core.series.Series'>
c.修改行名或列名
试了一下,怎么不好使…(原来这个操作没有设置inplace的话,是返回一个新对象…)
注意: 默认inplace=False. 这样是返回一个新的dataframe对象,原对象不变。
如果设置inplace=True,返回的是None,并且直接在原对象上修改。
renamed_df1 = df1.rename(index={'一': 'one'}, columns={'col1':'new_col1'},inplace=True)
print(renamed_df1)
print(df1)
None
new_col1 col2 col3
one a 5 1.3
二 b 6 2.5
三 c 7 3.6
四 d 8 3.2
五 e 9 8.0
d.调用属性和方法
df.index;df.colums; 第一个看行索引是什么东西;第二个看列索引是什么东西。
df.values;df.shape; 注意values返回的数据类型是ndarray。
df.mean() 这个是对每一列取平均,所以对应每一列会有一个均值。(第三章详细介绍这种aggregation)
print(df1.index) # 获取索引
print(df1.columns)
print(df1.values, type(df1.values))
print(df1.shape)
print(df1.mean()) # 每一行的平均值,aggregation操作
Index(['一', '二', '三', '四', '五'], dtype='object')
Index(['col1', 'col2', 'col3'], dtype='object')
[['a' 5 1.3]
['b' 6 2.5]
['c' 7 3.6]
['d' 8 3.2]
['e' 9 8.0]] <class 'numpy.ndarray'>
(5, 3)
col2 7.00
col3 3.72
dtype: float64
e.索引对齐特性
比如相减是对应索引一样的行相减
下面的这个例子结果就不是0.
df2 = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 2, 3]}, index=[1, 2, 3])
df3 = pd.DataFrame({'A': [1, 2, 3], 'B': [1, 2, 3]}, index=[2, 3, 1])
print(df2)
print(df3)
print(df2-df3)
A B
1 1 1
2 2 2
3 3 3
A B
2 1 1
3 2 2
1 3 3
A B
1 -2 -2
2 1 1
3 1 1
f. 行列的添加与删除
drop,del,pop都是实现删除的功能
drop: 既可以删除一整行,也可以删除一整列,像rename有inplace选项。
df1.drop(index='五', columns='col1', inplace=True)
pop()删除一整列,就是很像list的pop,直接在原对象操作,返回被删掉的列。
poped_col = df1.pop('col1') # 直接在原对象上删除,并且返回删除的列,很像列表的pop
print(poped_col)
del 直接删掉一列
del df1['col1']
print(df1)
添加一列:像字典一样df1[‘new_col’]=[,…,] ; assign
df[‘new_col’]=[,…,] 形式的添加要注意等号右边序列的长度要和df的行数一致,不然会报错。
assign如果使用Series添加列的话,不用考虑上面长度一致的问题,添加的列的长度太短,会补上NaN. 长度过长会裁掉。使用list添加列,也会有上面的问题。
assign具体用法见《合并》那一节。
df1['col1'] = [1, 2, 3, 4]
print(df1)
注意:assign不能在原对象上修改,也没有inplace操作。
print(df1.assign(C=pd.Series(list('def'))))
col2 col3 col1 C
一 5 1.3 1 NaN
二 6 2.5 2 NaN
三 7 3.6 3 NaN
四 8 3.2 4 NaN
上面出现NaN的原因是:索引对齐…C=pd.Series(list(‘def’))的行索引是0 1 2, 现在修改一下:
print(df1.assign(C=pd.Series(list('def'), index=list('一二三'))))
col2 col3 col1 C
一 5 1.3 1 d
二 6 2.5 2 e
三 7 3.6 3 f
四 8 3.2 4 NaN
g. 选择列
根据类型选择。
df1.select_dtypes()
print(df1)
print(df1.select_dtypes(include=['number']))
col2 col3 col1 C
一 5 1.3 1 d
二 6 2.5 2 e
三 7 3.6 3 f
四 8 3.2 4 NaN
col2 col3 col1
一 5 1.3 1
二 6 2.5 2
三 7 3.6 3
四 8 3.2 4
h.将Series转换为DataFrame
注意:dataframe求mean()之后变成series
df1_mean = df1.mean()
df1_mean.name = 'df1_mean'
print(df1_mean, type(df1_mean))
print(df1_mean.to_frame())
col2 6.50
col3 2.65
col1 2.50
Name: df1_mean, dtype: float64 <class 'pandas.core.series.Series'>
df1_mean
col2 6.50
col3 2.65
col1 2.50
i. dataframe可以转置
直接df.T
print(df2)
print(df2.T)
A B
1 1 1
2 2 2
3 3 3
1 2 3
A 1 2 3
B 1 2 3
总结一下,操作就那么几种,创建一个数据类型,访问其属性、调用其方法、根据索引访问数据。