pandas 入门

pandas 入门

pandas 集成了 numpy与matplotlib 两个工具包; 主要的两个对象:Series(一维数据),DataFrame(二维数据), 重点学习DataFrame的使用。
numpy == 1.18.2
pandas == 1.0.3
Python == 3.7

一、创建Series与DataFrame数据对象

import pandas as pd
import numpy as np
# pandas Series 一维数据
s = pd.Series([1,2,3,np.nan,123])
print(s)
# 时间 index 索引
dates = pd.date_range('2020-05-01', periods=5)
print(dates)
# pandas DataFrame 二维数据
a = pd.DataFrame(np.random.randn(5,1), index=dates, columns=['c1'])
b = pd.DataFrame(np.random.randn(5,2), index=dates, columns=['数量','价格'])
print(a)
print(b)
# 不指定 字段和索引= pd.DataFrame(np.arange(12).reshape(3,4))
print()
# 字典生成 DataFrame 对象
stu= pd.DataFrame({"name": ["张三","李四","王五"],
                  "age": np.random.randint(1,100, size=3),
                  "class": "二班"
                  })
print(stu)

0      1.0
1      2.0
2      3.0
3      NaN
4    123.0
dtype: float64
DatetimeIndex(['2020-05-01', '2020-05-02', '2020-05-03', '2020-05-04',
               '2020-05-05'],
              dtype='datetime64[ns]', freq='D')
                  c1
2020-05-01 -1.231058
2020-05-02 -0.081396
2020-05-03  0.603540
2020-05-04 -0.275905
2020-05-05 -0.638174
                  数量        价格
2020-05-01 -0.825869  1.358116
2020-05-02 -1.813568  1.377512
2020-05-03 -0.562157  0.719284
2020-05-04 -0.850693  0.538530
2020-05-05  1.116333  0.448529
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
  name  age class
0   张三   48    二班
1   李四   45    二班
2   王五    1    二班

二、DataFrame的属性与方法

print(stu.index) # 索引
print(stu.columns) # 字段
print(stu.values) # DataFrame的值
print(stu.describe()) # 统计
print(stu.T) # 转置
print(stu.sort_index(axis=1, ascending=True)) # 列排序
print("行排序,ascending=False 倒序")
print(stu.sort_index(axis=0, ascending=False)) # 行排序
print("按照指定序列排序")
print(stu.sort_values(by='age', ascending=True)) # 指定字段排序
print(stu)
RangeIndex(start=0, stop=3, step=1)
Index(['name', 'age', 'class'], dtype='object')
[['张三' 48 '二班']
 ['李四' 45 '二班']
 ['王五' 1 '二班']]
             age
count   3.000000
mean   31.333333
std    26.312228
min     1.000000
25%    23.000000
50%    45.000000
75%    46.500000
max    48.000000
        0   1   2
name   张三  李四  王五
age    48  45   1
class  二班  二班  二班
   age class name
0   48    二班   张三
1   45    二班   李四
2    1    二班   王五
行排序,ascending=False 倒序
  name  age class
2   王五    1    二班
1   李四   45    二班
0   张三   48    二班
按照指定序列排序
  name  age class
2   王五    1    二班
1   李四   45    二班
0   张三   48    二班
  name  age class
0   张三   48    二班
1   李四   45    二班
2   王五    1    二班

三、DataFrame对象数据的选择

数据的选择,可以根据行或者列的下标筛选,也可以使用label进行筛选。筛选后返回 Series 或者 DataFrame 类型的对象。

import pandas as pd
import numpy as np
dates = pd.date_range("2020-05-04", periods=3)
df = pd.DataFrame(np.arange(9).reshape((3,3)), index=dates, columns=["A","B","C"])
print(df)
            A  B  C
2020-05-04  0  1  2
2020-05-05  3  4  5
2020-05-06  6  7  8
print("colums索引,取出一列")
print(df["A"])
a = df.A
print(a, type(a))
colums索引,取出一列
2020-05-04    0
2020-05-05    3
2020-05-06    6
Freq: D, Name: A, dtype: int32
2020-05-04    0
2020-05-05    3
2020-05-06    6
Freq: D, Name: A, dtype: int32 <class 'pandas.core.series.Series'>
print("切片形式")
print(df[0:2])
a = df[0:2]
print(a, type(a))
print(df["2020-05-04":"2020-05-05"])
切片形式
            A  B  C
2020-05-04  0  1  2
2020-05-05  3  4  5
            A  B  C
2020-05-04  0  1  2
2020-05-05  3  4  5 <class 'pandas.core.frame.DataFrame'>
            A  B  C
2020-05-04  0  1  2
2020-05-05  3  4  5
print("loc函数,根据行列的label选值")
print(df.loc["2020-05-04"]) # 行索引
print("------------------")
print(df.loc["2020-05-04":"2020-05-05","A"]) # 行列索引
print("------------------")
print(df.loc["2020-05-04":"2020-05-05","A":"B"])
loc函数,根据行列的label选值
A    0
B    1
C    2
Name: 2020-05-04 00:00:00, dtype: int32
------------------
2020-05-04    0
2020-05-05    3
Freq: D, Name: A, dtype: int32
------------------
            A  B
2020-05-04  0  1
2020-05-05  3  4
print("pandas.iloc() 函数,根据行列位置选择")
print(df.iloc[0:1,1:2]) # 切片
print(df.iloc[[0,2],1:2]) # 枚举筛选
pandas.iloc() 函数,根据行列位置选择
            B
2020-05-04  1
            B
2020-05-04  1
2020-05-06  7
# 根据条件筛选

a = df > 2 # 逻辑比较,会返回一个DataFrame, 内容为bool
print(a, type(a))
print(df[a])
print(df[df.A > 1])
b = df.A >1
print(b, type(b))
print(df[df == 2])
                A      B      C
2020-05-04  False  False  False
2020-05-05   True   True   True
2020-05-06   True   True   True <class 'pandas.core.frame.DataFrame'>
              A    B    C
2020-05-04  NaN  NaN  NaN
2020-05-05  3.0  4.0  5.0
2020-05-06  6.0  7.0  8.0
            A  B  C
2020-05-05  3  4  5
2020-05-06  6  7  8
2020-05-04    False
2020-05-05     True
2020-05-06     True
Freq: D, Name: A, dtype: bool <class 'pandas.core.series.Series'>
             A   B    C
2020-05-04 NaN NaN  2.0
2020-05-05 NaN NaN  NaN
2020-05-06 NaN NaN  NaN

四、DataFrame的赋值

import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(24).reshape((6,4)), columns=["a","b","c","d"])
print("原始数据")
print(df)
print("loc选择赋值")
df.loc[1, "a"] = np.nan
print(df)
print("iloc选择赋值")
df.iloc[1,3] = 13
print(df)
print("按条件赋值")
df[df > 20] = 200
print(df)
print("整列赋值")
df.c = 30
print(df)
原始数据
    a   b   c   d
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19
5  20  21  22  23
loc选择赋值
      a   b   c   d
0   0.0   1   2   3
1   NaN   5   6   7
2   8.0   9  10  11
3  12.0  13  14  15
4  16.0  17  18  19
5  20.0  21  22  23
iloc选择赋值
      a   b   c   d
0   0.0   1   2   3
1   NaN   5   6  13
2   8.0   9  10  11
3  12.0  13  14  15
4  16.0  17  18  19
5  20.0  21  22  23
按条件赋值
      a    b    c    d
0   0.0    1    2    3
1   NaN    5    6   13
2   8.0    9   10   11
3  12.0   13   14   15
4  16.0   17   18   19
5  20.0  200  200  200
整列赋值
      a    b   c    d
0   0.0    1  30    3
1   NaN    5  30   13
2   8.0    9  30   11
3  12.0   13  30   15
4  16.0   17  30   19
5  20.0  200  30  200

五、DataFrame 数据缺失值处理

当数据中存在缺失值时,即值等于 NaN,则可以选择丢掉改行或列,或者进行数据填充。

import pandas as pd
import numpy as np

df = pd.DataFrame([[1,3,5],[np.nan, 0, 8], [9,0,2]], columns=["a", "b","c"])
print(df)
     a  b  c
0  1.0  3  5
1  NaN  0  8
2  9.0  0  2
# 判断是否存在缺失值
print(df.isnull())
print("------------")
print(df.isnull().any())
print("------------")
print(df.isnull().any().any())
print("------------")
print(np.any(df.isnull()== True)) # 可以省略 ==True
print(np.any(df.isnull()))
       a      b      c
0  False  False  False
1   True  False  False
2  False  False  False
------------
a     True
b    False
c    False
dtype: bool
------------
True
------------
True
True
a = df.dropna(axis=1, how="any") # 案列删除
print("按行删除")
print(a)
b = df.dropna(axis=0, how="any") # 按行删除
print("按列删除")
print(b)
print("按行删除 how=all 则必须全部为 nan才会删除")
c = df.dropna(axis=0, how="all") # 按行删除 how=all 则必须全部为 nan才会删除
print(c)
print("原数据不受影响")
print(df)

按行删除
   b  c
0  3  5
1  0  8
2  0  2
按列删除
     a  b  c
0  1.0  3  5
2  9.0  0  2
按行删除 how=all 则必须全部为 nan才会删除
     a  b  c
0  1.0  3  5
1  NaN  0  8
2  9.0  0  2
原数据不受影响
     a  b  c
0  1.0  3  5
1  NaN  0  8
2  9.0  0  2
# 填充缺失值
a = df.fillna(value=100)
print(a)
print("原数据不变")
print(df)
       a  b  c
0    1.0  3  5
1  100.0  0  8
2    9.0  0  2
原数据不变
     a  b  c
0  1.0  3  5
1  NaN  0  8
2  9.0  0  2

六、pandas 数据的导入导出

import pandas as pd
import numpy as np
# 导入函数
# read_csv
# read_excel
# read_sql
# read_json
# read_html
# read_pickle

# 对应的导出函数
# to_csv
# to_excel
# to_json
# ...
# 从excel中导入
df = pd.read_excel("students.xlsx")
print(df)
  name  age class
0   张三   18    二班
1   李四   19    二班
2   王五   20    二班
3   赵六   18    二班
4  李狗蛋   19   NaN
# 处理缺失值
if np.any(df.isnull()==True):
    df = df.dropna(axis=0)
print(df)
  name  age class
0   张三   18    二班
1   李四   19    二班
2   王五   20    二班
3   赵六   18    二班
b = df.index
print(len(b))
# 增加一行数据
a = df.append({"name":"小红","age":18, "class":"二班"}, ignore_index=True)
print(a)
print("原数据不变")
print(df)
a.to_excel("students2.xlsx") # 如果已经有表存在则会覆盖
4
  name  age class
0   张三   18    二班
1   李四   19    二班
2   王五   20    二班
3   赵六   18    二班
4   小红   18    二班
原数据不变
  name  age class
0   张三   18    二班
1   李四   19    二班
2   王五   20    二班
3   赵六   18    二班

七、DataFrame数据合并

# 可使用的函数 pd.concat()
# DataFrame.append()
# pd.merge()
import pandas as pd
import numpy as np
# columns 一样的合并
df1 = pd.DataFrame(np.random.randn(4,3), columns=["a","b","c"])
df2 = pd.DataFrame(np.arange(3).reshape(1,3), columns=["a","b","c"])
df3 = pd.DataFrame(np.ones((1,3))*8, columns=["a","b","c"])
print(df1)
print(df2)
print(df3)
res1 = pd.concat([df1,df2,df3], axis=0) # axis=0 按照行方向合并
res2 = pd.concat([df1,df2,df3], axis=0, ignore_index=True) # ignore_index=True 重新生成index
print(res1)
print(res2)
          a         b         c
0  1.091629  1.579258 -0.023059
1  2.645556  0.768897 -1.165307
2  0.899328  0.466672  1.617765
3  0.448329  1.283554  0.584536
   a  b  c
0  0  1  2
     a    b    c
0  8.0  8.0  8.0
          a         b         c
0  1.091629  1.579258 -0.023059
1  2.645556  0.768897 -1.165307
2  0.899328  0.466672  1.617765
3  0.448329  1.283554  0.584536
0  0.000000  1.000000  2.000000
0  8.000000  8.000000  8.000000
          a         b         c
0  1.091629  1.579258 -0.023059
1  2.645556  0.768897 -1.165307
2  0.899328  0.466672  1.617765
3  0.448329  1.283554  0.584536
4  0.000000  1.000000  2.000000
5  8.000000  8.000000  8.000000
# columns 不一样时
df4 = pd.DataFrame(np.zeros((1,3)), columns=["a","b","g"]) # g 在 df1-3中没有
print(df4)
res = pd.concat([df3,df4], ignore_index=True) # 默认join="outer"
print("默认处理方式为 outer") # 保留全部的 columns 没有值的地方赋值为 NaN
print(res)
res2 = pd.concat([df3,df4],join="outer", ignore_index=True)
print("join=outer")
print(res2)
res3 = pd.concat([df3,df4], join="inner", ignore_index=True)
print("join=inner") # 与 mysql 中两种表的 inner join 是一致的, 取columns一样的数据合并
print(res3)
     a    b    g
0  0.0  0.0  0.0
默认处理方式为 outer
     a    b    c    g
0  8.0  8.0  8.0  NaN
1  0.0  0.0  NaN  0.0
join=outer
     a    b    c    g
0  8.0  8.0  8.0  NaN
1  0.0  0.0  NaN  0.0
join=inner
     a    b
0  8.0  8.0
1  0.0  0.0
# axis = 1的合并
res = pd.concat([df1, df3, df4], axis=1)
print(df1)
print(df3)
print(df4)
# 将全部 index都处理,没有的赋值为 NaN
print(res)

          a         b         c
0  1.091629  1.579258 -0.023059
1  2.645556  0.768897 -1.165307
2  0.899328  0.466672  1.617765
3  0.448329  1.283554  0.584536
     a    b    c
0  8.0  8.0  8.0
     a    b    g
0  0.0  0.0  0.0
          a         b         c    a    b    c    a    b    g
0  1.091629  1.579258 -0.023059  8.0  8.0  8.0  0.0  0.0  0.0
1  2.645556  0.768897 -1.165307  NaN  NaN  NaN  NaN  NaN  NaN
2  0.899328  0.466672  1.617765  NaN  NaN  NaN  NaN  NaN  NaN
3  0.448329  1.283554  0.584536  NaN  NaN  NaN  NaN  NaN  NaN
# DataFrame.append()
# append DataFrame
res1= df3.append(df4, ignore_index=True)
print(res1)
     a    b    c    g
0  8.0  8.0  8.0  NaN
1  0.0  0.0  NaN  0.0
# append Series
s1 = pd.Series([1,2,3], index=["a","b","c"])
print(s1)
res2 = df3.append(s1, ignore_index=True)
print(res2)
a    1
b    2
c    3
dtype: int64
     a    b    c
0  8.0  8.0  8.0
1  1.0  2.0  3.0
# pandas.merge() 两个DataFrame合并
# how 的方式:inner(内连接)、outer(外链接)、left(左连接)、right(右连接)
print(df3)
print(df4)
res = pd.merge(df3,df4) # 默认merge
print(res)
print("how=outer")
res2= pd.merge(df3,df4, how="outer")
print(res2)
print("how=outer, on=a")
res2= pd.merge(df3,df4, on= "a", how="outer")
print(res2)
print("how=left")
res3= pd.merge(df3,df4, how="left")
print(res3)
print("how=left, on=a")
res4= pd.merge(df3,df4,how="left",on="a") # 与mysql 中的 left join on 一样
print(res4)
print("how=inner")
df5 = pd.DataFrame([[8.0,3,5],[1,0,9],[8.0,8.0,9]],columns=["a","b","g"])
print(df5)
res5= pd.merge(df3,df5, how="inner", on="a")# 与mysql 中的 inner join on 一样
print(res5)
     a    b    c
0  8.0  8.0  8.0
     a    b    g
0  0.0  0.0  0.0
Empty DataFrame
Columns: [a, b, c, g]
Index: []
how=outer
     a    b    c    g
0  8.0  8.0  8.0  NaN
1  0.0  0.0  NaN  0.0
how=outer, on=a
     a  b_x    c  b_y    g
0  8.0  8.0  8.0  NaN  NaN
1  0.0  NaN  NaN  0.0  0.0
how=left
     a    b    c   g
0  8.0  8.0  8.0 NaN
how=left, on=a
     a  b_x    c  b_y   g
0  8.0  8.0  8.0  NaN NaN
how=inner
     a    b  g
0  8.0  3.0  5
1  1.0  0.0  9
2  8.0  8.0  9
     a  b_x    c  b_y  g
0  8.0  8.0  8.0  3.0  5
1  8.0  8.0  8.0  8.0  9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值