这个系列是看 https://github.com/yeayee/joyful-pandas 的笔记。
pandas概述
拿到数据—-读取数据—-读取到了数据得到的是怎样的数据对象?
主要操作:索引,分组,…,合并操作
学习方式:任务驱动型学习
文件读取
可以读取csv格式,txt格式,xls或xlsx格式的文件
df = pd.read_csv(r'data\table.csv')
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())
- 取消读入表头,可以设置参数header=None
写入文件
将pandas里面的文件对象写入成 外部文件格式.
可以写入成csv格式,xls或xlsx格式.
df.to_csv('data/new_table.csv')
df.to_excel('data/new_table2.xlsx', sheet_name='sheet1')
基本数据结构介绍
a.创建一个series 对象:
series对象最常用的属性是values,index,name,dtype。
values: 就是series里的数据,index: 行索引,name: 这个series的名字,dtype:数据类型。
- 直接指定values就能创建一个series,可以使用numpy的ndarray数据类型来指定。
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
- 输出的最后一行都会给出数据类型呢的dtype。
- 前面没有给index,出来的就是默认索引,其实也可以 自己给一个序列来指定索引。
- 还可以给指定name,给这个series起名,最后一行也会输出这个series的name。
s1 = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'],name='my series')
print(s1)
- 使用字典创建Series,行索引index默认就是字典的keys,值就是字典的values。
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())
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')
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
总结一下,操作就那么几种,创建一个数据类型, 访问其属性、调用其方法、根据索引访问数据。
Original: https://blog.csdn.net/weixin_44360866/article/details/125889400
Author: Michael_Flemming
Title: 0 pandas概述–1文件读取与写入–2 基本操作
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/743842/
转载文章受原作者版权保护。转载请注明原作者出处!