0 pandas概述--1文件读取与写入--2 基本操作

这个系列是看 https://github.com/yeayee/joyful-pandas 的笔记。

pandas概述

拿到数据----读取数据----读取到了数据得到的是怎样的数据对象?

主要操作:索引,分组,…,合并操作

学习方式:任务驱动型学习

文件读取

可以读取csv格式,txt格式,xls或xlsx格式的文件

  1. 读csv格式文件
df = pd.read_csv(r'data\table.csv')  # 读取文件,得到df对象
print(df.head)  

如果读取文件时遇到和列数不对应的行,此时会报错。若报错行可以忽略,添加以下参数:

pandas.read_csv(***,error_bad_lines=False)
  1. 读txt文件
df_txt = pd.read_table(r'data\table.txt')
print(df_txt)
  1. 读excel的xls和xlsx文件
df_excel = pd.read_excel('data/table.xlsx')
print(df_excel.head())
  • 取消读入表头,可以设置参数header=None

写入文件

将pandas里面的文件对象写入成 外部文件格式.
可以写入成csv格式,xls或xlsx格式.

  1. 写入成为csv格式文件
    写入时还可以选择带不带行索引
df.to_csv('data/new_table.csv')  # 默认index=True,是有带行索引的
# df.to_csv('data/mew_table.csv', index=False)  # 写入不带行索引
  1. 写入成为xls或xlsx文件
    还可以命名sheet
df.to_excel('data/new_table2.xlsx', sheet_name='sheet1')  # 还可以命名sheet

基本数据结构介绍

1. series数据类型

**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。
# 使用字典创建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('__')])

结果不列出来了,太多了。

2.DataFrame数据类型

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     16   2.5     27   3.6     38   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

总结一下,操作就那么几种,创建一个数据类型,访问其属性、调用其方法、根据索引访问数据。

你可能感兴趣的:(pandas记录,pandas,python,数据分析)