5_2 Pandas入门

本文深入探讨Pandas库在Python数据分析中的高级应用,包括数据筛选、数据对齐、算术运算及数据填充等关键操作,助力提升数据处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Jupyter Notebok查看效果更佳!

丢弃指定轴上的项

import pandas as pd
import numpy as np
obj = pd.Series(np.arange(5.),index = ['a', 'b','c', 'd', 'e'])
obj
a    0.0
b    1.0
c    2.0
d    3.0
e    4.0
dtype: float64
new_obj = obj.drop('c')
new_obj
a    0.0
b    1.0
d    3.0
e    4.0
dtype: float64
obj.drop(['d','e'])
a    0.0
b    1.0
c    2.0
dtype: float64
  • 对于DataFrame可以删除任意轴上的索引
data = pd.DataFrame(np.arange(16).reshape((4,4)),
                    index = ['Ohio', 'Colorado', 'Utah', 'New York'],
                   columns = ['one', 'two', 'three', 'four'])
data
onetwothreefour
Ohio0123
Colorado4567
Utah891011
New York12131415
data.drop(['Colorado','Ohio'])
onetwothreefour
Utah891011
New York12131415
  • 通过传递axis=1或者axis='columns’可以删除列的值:
data.drop('two',axis=1)
onethreefour
Ohio023
Colorado467
Utah81011
New York121415
  • 以上操作会返回一个新的对象,原数据结构并不变化,但是可以通过传入inplace参数就地修改对象
data.drop('one',axis=1,inplace=True)
data
twothreefour
Ohio123
Colorado567
Utah91011
New York131415

索引、选取、过滤

  • Series索引和numpy数组的索引差不多,只不过Series的索引值不一定是整数
obj = pd.Series(np.arange(4), index = ['a','b','c','d'])
obj
a    0
b    1
c    2
d    3
dtype: int32
obj['b']
1
obj[2:4]
c    2
d    3
dtype: int32
obj[['a','c','d']]
a    0
c    2
d    3
dtype: int32
  • 利用标签的切片运算和普通的python不同,末端是包含的
obj['a':'c']
a    0
b    1
c    2
dtype: int32
obj['a':'c'] = 5
obj
a    5
b    5
c    5
d    3
dtype: int32

DataFrame

  • 利用一个值或者序列对DataFrame进行索引其实就是获取一个或者多个列
data = pd.DataFrame(np.arange(16).reshape((4,4)),
                    index=['Ohio', 'Colorado', 'Utah', 'New York'],
                    columns=['one', 'two', 'three', 'four']
                   )
data
onetwothreefour
Ohio0123
Colorado4567
Utah891011
New York12131415
data['two']
Ohio         1
Colorado     5
Utah         9
New York    13
Name: two, dtype: int32
data[['three','two']]
threetwo
Ohio21
Colorado65
Utah109
New York1413
data[:2]
onetwothreefour
Ohio0123
Colorado4567
data[data['three']>5]
onetwothreefour
Colorado4567
Utah891011
New York12131415
# 利用布尔型DataFrame进行索引
data<5
onetwothreefour
OhioTrueTrueTrueTrue
ColoradoTrueFalseFalseFalse
UtahFalseFalseFalseFalse
New YorkFalseFalseFalseFalse
data[data<5]
onetwothreefour
Ohio0.01.02.03.0
Colorado4.0NaNNaNNaN
UtahNaNNaNNaNNaN
New YorkNaNNaNNaNNaN
data[data<6]=0
data
onetwothreefour
Ohio0000
Colorado0067
Utah891011
New York12131415

使用loc和iloc进行选取

  • 对于DataFrame的行的标签索引,我引入了特殊的标签运算符loc和iloc。它们可以让你用类似NumPy的标记,使用轴标签(loc)或整数索引(iloc),从DataFrame选择行和列的子集。
data.loc['Colorado',['two','three']]
two      0
three    6
Name: Colorado, dtype: int32
data.iloc[2,[3,0,1]]
four    11
one      8
two      9
Name: Utah, dtype: int32
  • loc和iloc函数也适用于切片索引
data.loc[:'Utah', 'two']
Ohio        0
Colorado    0
Utah        9
Name: two, dtype: int32
data.iloc[:,:3][data.three>5]
onetwothree
Colorado006
Utah8910
New York121314

name

整数索引

# 对于非整数索引不会产生歧义
ser = pd.Series(np.arange(3.0),index=['a', 'b', 'c'])
ser
a    0.0
b    1.0
c    2.0
dtype: float64
ser[-1]
2.0
  • 为了进行统一,如果轴索引含有整数,数据总会使用标签。为了更加准确,推荐使用loc(标签索引)和iloc(整数索引)
# 对于整数索引,会产生索引
ser2 = pd.Series(np.arange(3.0))
ser2
0    0.0
1    1.0
2    2.0
dtype: float64
ser2.iloc[:1]
0    0.0
dtype: float64
ser2.loc[:1]
0    0.0
1    1.0
dtype: float64
ser2[:1]
0    0.0
dtype: float64

数据运算和数据对齐

  • pandas的一个重要的功能是可以对不同的索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集
s1 = pd.Series([7.3,-2.5,3.4,1.5], index=['a','b','c','d'])
s2 = pd.Series([-2.1,3.6,-1.5,4,3.1],index=['a','c','e','f','g'])
s1
a    7.3
b   -2.5
c    3.4
d    1.5
dtype: float64
s2
a   -2.1
c    3.6
e   -1.5
f    4.0
g    3.1
dtype: float64
s1 + s2
a    5.2
b    NaN
c    7.0
d    NaN
e    NaN
f    NaN
g    NaN
dtype: float64
  • 对于DataFrame 对齐操作同时作用于行和列上
df1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list('bcd'),
                   index=['Ohio', 'Texas', 'Colorado'])
df2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'),
                   index=['Utah', 'Ohio', 'Texas', 'Oregon'])
df1
bcd
Ohio0.01.02.0
Texas3.04.05.0
Colorado6.07.08.0
df2
bde
Utah0.01.02.0
Ohio3.04.05.0
Texas6.07.08.0
Oregon9.010.011.0
df1 + df2
bcde
ColoradoNaNNaNNaNNaN
Ohio3.0NaN6.0NaN
OregonNaNNaNNaNNaN
Texas9.0NaN12.0NaN
UtahNaNNaNNaNNaN
# DataFrame对象相加,没有共用的列或行标签,结果都会是空:
df1 = pd.DataFrame({'A':[1,2]})
df2 = pd.DataFrame({'B':[3,4]})
df1
A
01
12
df2
B
03
14
df1+df2
AB
0NaNNaN
1NaNNaN

在算术方法中填充值

  • 在对具有不同索引的对象进行算术运算时,希望对不同是具有的轴标签赋值(比如:0)
df1 = pd.DataFrame(np.arange(12).reshape((3,4)),columns=list('abcd'))
df2 = pd.DataFrame(np.arange(20).reshape(4,5),columns=list('abcde'))
df2.loc[1,'b'] = np.nan
df1
abcd
00123
14567
2891011
df2
abcde
001.0234
15NaN789
21011.0121314
31516.0171819
df1+df2 # 引入了nan,但是相对nan赋值 
abcde
00.02.04.06.0NaN
19.0NaN13.015.0NaN
218.020.022.024.0NaN
3NaNNaNNaNNaNNaN
df1.add(df2, fill_value=0)
abcde
00.02.04.06.04.0
19.05.013.015.09.0
218.020.022.024.014.0
315.016.017.018.019.0
1/df1
abcd
0inf1.0000000.5000000.333333
10.2500000.2000000.1666670.142857
20.1250000.1111110.1000000.090909
df1.rdiv(1) #相当于1/df1
abcd
0inf1.0000000.5000000.333333
10.2500000.2000000.1666670.142857
20.1250000.1111110.1000000.090909
  • 表5-4列出了Series和DataFrame所支持的算术运算
    5-4

  • 对于Series和DataFrame重新索引时,也可以指定一个填充值

df1.reindex(columns=df2.columns,fill_value=0)
abcde
001230
145670
28910110

DataFrame和Series之间的运算

arr = np.arange(12.).reshape((3,4))
arr
array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.]])
arr[0]
array([0., 1., 2., 3.])
np.array(arr[0])
array([0., 1., 2., 3.])
arr - arr[0]
array([[0., 0., 0., 0.],
       [4., 4., 4., 4.],
       [8., 8., 8., 8.]])
  • 上面的启发性例子,当两个维数不一样的数组相减时,每一行都会减,这叫做广播。DataFrame和Series之间的运算差不多
frame = pd.DataFrame(np.arange(12.).reshape((4,3)),
                    columns=list('bde'),
                    index=['Utah','Ohio','Texas','Oregon'])
series = frame.iloc[0]
frame
bde
Utah0.01.02.0
Ohio3.04.05.0
Texas6.07.08.0
Oregon9.010.011.0
series
b    0.0
d    1.0
e    2.0
Name: Utah, dtype: float64
frame - series
bde
Utah0.00.00.0
Ohio3.03.03.0
Texas6.06.06.0
Oregon9.09.09.0
  • 如果某个索引值在DataFrame的列或者Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集:
series2 = pd.Series(range(3),index=['b','e','f'])
series2
b    0
e    1
f    2
dtype: int64
frame + series2
bdef
Utah0.0NaN3.0NaN
Ohio3.0NaN6.0NaN
Texas6.0NaN9.0NaN
Oregon9.0NaN12.0NaN
  • 如果希望匹配行且在列上进行广播,则必须使用算术运算方法
series3 = frame['d']
series3
Utah       1.0
Ohio       4.0
Texas      7.0
Oregon    10.0
Name: d, dtype: float64
frame.sub(series3,axis='index')
bde
Utah-1.00.01.0
Ohio-1.00.01.0
Texas-1.00.01.0
Oregon-1.00.01.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值