Python之Pandas(1)

前面我们介绍了numpy的简单使用,今天我们使用pandas来筛选数据和处理缺失值问题。

一:首先我们需要导入pandas和numpy模块

# 一般 pandas 和 numpy 都是配合在一起使用的
import pandas as pd
import numpy as np

二:首先我们使用pandas的Series()来创建

# index定义行的名称,默认从0~(N-1),N表示列表的长度
s = pd.Series([1,3,5,54,np.nan,9], index=[1,3,5,7,9,11])
"""
0     1.0
3     3.0
5     5.0
7    54.0
9     NaN
11     9.0
dtype: float64
"""

二 : 使用pd的date_range()创建一个时间索引

dates = pd.date_range("20170101",periods=10)
"""
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10'],
              dtype='datetime64[ns]', freq='D')

"""

三 : 下面我们开始创建测试数据
1:创建 DataFrame对象

df = pd.DataFrame(np.arange(20).reshape((5,4)),index=pd.date_range("20170101", periods=5),columns=['A','B','C','D'])
"""
             A   B   C   D
2017-01-01   0   1   2   3
2017-01-02   4   5   6   7
2017-01-03   8   9  10  11
2017-01-04  12  13  14  15
2017-01-05  16  17  18  19
"""

2:另一种创建方式

df2 = pd.DataFrame({
    'A':[i for i in range(4)],
    'B':pd.Timestamp('20170102'),
    'C':pd.Series([i for i in range(4)],index=pd.date_range("20170101", periods=4),dtype='float32'),
    'D':pd.Categorical(["test","train","test","train"])
})

3 : 使用sort_index()对索引名称进行排序

# axis = 1 表示对列排序
# sacending = False 表示降序, 默认为True
print(df.sort_index(axis=1, ascending=False))
"""
             D   C   B   A
2017-01-01   3   2   1   0
2017-01-02   7   6   5   4
2017-01-03  11  10   9   8
2017-01-04  15  14  13  12
2017-01-05  19  18  17  16
"""

4 : 使用sort_values()对值进行排序

print(df.sort_values(by="D",ascending=False))
"""
             A   B   C   D
2017-01-05  16  17  18  19
2017-01-04  12  13  14  15
2017-01-03   8   9  10  11
2017-01-02   4   5   6   7
2017-01-01   0   1   2   3

"""

5 :通过标签名筛选数据 : loc

# 获取某一行的数据
d = df.loc["20170101"]
print(d)
"""
A    0
B    1
C    2
D    3
Name: 2017-01-01 00:00:00, dtype: int32
"""
# 获取某一个数据
df.loc["20170102"]["A"] # 4
# 返回某一行的某几列数据
print(df.loc["20170101",["A","B"]])
"""
A    0
B    1
Name: 2017-01-01 00:00:00, dtype: int32
"""
# 获取所有行的某几列
print([:,["A","B"]])
"""
             A   B
2017-01-01   0   1
2017-01-02   4   5
2017-01-03   8   9
2017-01-04  12  13
2017-01-05  16  17
"""

6 : 通过索引筛选数据:iloc

print(df.iloc[1:3,1:3]) # 筛选1到3行(不包含第三行),1到3列(不包含第三列)的数据
"""
            B   C
2017-01-02  5   6
2017-01-03  9  10
"""

7 : 混合筛选数据 : ix

print(df.ix[:2,["A","C"]]) # 筛选前2行(不包含末尾),A列,C列数据
"""
            A  C
2017-01-01  0  2
2017-01-02  4  6
"""

接下来我们来使用Pandas处理缺失值
一:定义一个序列

s = pd.Series([
    1,3,5,7,45,
    11,23,np.nan,34,
    np.nan,23,12,34,
    11,np.nan,np.nan,34
])
# 输出序列中有多少Nan的值
count = sum(pd.isnull(s))
print(count) # 4

二:直接删除缺失值

# 定义一个DataFrame对象
df = pd.DataFrame([
    [1,23,45,33],
    [12,34,np.nan,28],
    [32,np.nan,90,np.nan],
], columns=["A","B","C","D"])

print(df)
"""
    A     B     C     D
0   1  23.0  45.0  33.0
1  12  34.0   NaN  28.0
2  32   NaN  90.0   NaN
"""

# 直接删除缺省值
df = df.dropna()  # 默认情况下(axis=0, how="any")只要行中存在有nan值,该行就会被删除
"""
   A     B     C     D
0  1  23.0  45.0  33.0
"""

df = df.dropna(axis=1, how="all") # 删除全部是nan的列,没有满足的条件因此没有删除
"""
    A     B     C     D
0   1  23.0  45.0  33.0
1  12  34.0   NaN  28.0
2  32   NaN  90.0   NaN
"""

df = df.drop("A", axis=1) # 删除A列
"""
      B     C     D
0  23.0  45.0  33.0
1  34.0   NaN  28.0
2   NaN  90.0   NaN
"""

df =df.drop([0,1]) # 删除0,1两行数据
"""
    A   B     C   D
2  32 NaN  90.0 NaN
"""

三 : 填充缺失值

df = df.fillna(0)  # 使用 0 来替换nan的值
"""
    A     B     C     D
0   1  23.0  45.0  33.0
1  12  34.0   0.0  28.0
2  32   0.0  90.0   0.0
"""

#采用前项填充或后项填充
# 后项填充 等价于 df.fillna(method="bfill")
df = df.bfill()  # meth:`DataFrame.fillna(method='bfill') <DataFrame.fillna>`
"""
    A     B     C     D
0   1  23.0  45.0  33.0
1  12  34.0  90.0  28.0
2  32   NaN  90.0   NaN
"""

# 前项填充
df = df.fillna(method="ffill")
"""
    A     B     C     D
0   1  23.0  45.0  33.0
1  12  34.0  45.0  28.0
2  32  34.0  90.0  28.0
"""

# 使用常亮填充不同列
df = df.fillna({"A":1, "B":2, "C":3, "D":4})
"""
    A     B     C     D
0   1  23.0  45.0  33.0
1  12  34.0   3.0  28.0
2  32   2.0  90.0   4.0
"""

# 使用均值或中位数填充各自的列

A_median = df["A"].median()
B_median = df["B"].median()
C_median = df["C"].median()
D_median = df["D"].median()

print(A_median, B_median, C_median, D_median)
# 12.0 28.5 67.5 30.5

df = df.fillna({"A":A_median, "B":B_median, "C":C_median, "D":D_median})
"""
    A     B     C     D
0   1  23.0  45.0  33.0
1  12  34.0  67.5  28.0
2  32  28.5  90.0  30.5
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值