pandas 数据结构之系列、数据帧详解

文章介绍了Pandas库中的Series和DataFrame数据结构。Series是一维标记数组,可保存各种数据类型,支持字典式操作和类似ndarray的切片。DataFrame是二维数据结构,列可以是不同类型,可以从多种输入构建,如Series、字典、ndarray等。文章还讨论了数据对齐、算术运算、列选择与删除以及控制台显示等操作。
摘要由CSDN通过智能技术生成

系列

系列是一个一维标记数组,能够保存任何数据 类型(整数、字符串、浮点数、Python 对象等)。

轴标签统称为索引。创建序列的基本方法是调用

s = pd.Series(data, index=len(data))

其中data可以为 NDARRAY、字典、标量值

为ndarray

如果是 ndarray,则索引的长度必须与数据相同。如果没有 索引被传递,将创建一个具有值的索引

In:
s = pd.Series(np.arange(5),index=["a","b","c","d","e"])
print(s)
print(s.index)

Out:
a    0
b    1
c    2
d    3
e    4
dtype: int32
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
In:
a = pd.Series(np.random.randn(5))
print(a)

Out:
0    0.244636
1    1.038671
2    0.752578
3   -2.267479
4   -0.592213
dtype: float64

为字典

In:
b={"a":1,"b":2,"c":3}
c=pd.Series(b)
print(c)

print(pd.Series(b,index=["b","a","c","d"]))

Out:
a    1
b    2
c    3
dtype: int64

b    2.0
a    1.0
c    3.0
d    NaN
dtype: float64

如果传递索引,则数据中的值对应于 索引将被拉出
NaN(不是数字)是熊猫中使用的标准缺失数据标记。

为标量值

In:
print(pd.Series(5,index=[1,2,3,4,5]))

Out:
1    5
2    5
3    5
4    5
5    5
dtype: int64

系列类似 ndarray

系列类似ndarray,与列表切片相似

In:
a=pd.Series(np.random.randn(6))
print(a)
print(a[0])
print(a[:3])
print(a[::2])

Out:
0   -0.347091
1   -1.407420
2    0.348607
3    0.639882
4    0.632786
5    1.147535
dtype: float64

-0.34709118061406613

0   -0.347091
1   -1.407420
2    0.348607
dtype: float64

0   -0.347091
2    0.348607
4    0.632786
dtype: float64

系列类型

In:
a=pd.Series(np.random.randn(6))
b=pd.Series(np.arange(6))
print(a.dtype)
print(b.dtype)

Out:
float64
int32

序列转化为实际数组

In:
b=pd.Series(np.arange(6))
print(b.array)

Out:
[0, 1, 2, 3, 4, 5]

序列类似与ndarray 用to_numpy转为ndarray

In:
b=pd.Series(np.arange(6))
print(b.to_numpy())

Out:
[0 1 2 3 4 5]

系列是字典般的

序列也类似于固定大小的字典,您可以按索引获取和设置值 标签:

In:
a=pd.Series(np.random.randn(6),index=[1,4,4,4,5,6])
print(a)
print(a[4])
print(4 in a

Out:
1    1.143214
4   -0.784372
4    0.972141
4    2.132039
5   -0.329324
6    0.236532
dtype: float64

4   -0.784372
4    0.972141
4    2.132039
dtype: float64

True

系列没有索引值会报错 ,为了防止报错,使用Series.get

In:
a=pd.Series(np.random.randn(6),index=[1,4,4,4,5,6])
print(a.get(3))

Out:
None

默认为空,可以设置其他值

In:
a=pd.Series(np.random.randn(6),index=[1,4,4,4,5,6])
str="没有该索引"
print(a.get(str))

Out:
没有该索引

矢量化操作和标签对齐与系列

系列之间可以矢量化操作

In:
a=pd.Series(np.arange(2),index=[1,4])
print(a)
print(a+a)
print(a*2)
print(np.exp(a))

Out:
1    0
4    1
dtype: int32
1    0
4    2
dtype: int32
1    0
4    2
dtype: int32
1    1.000000
4    2.718282
dtype: float64

名称属性

系列还有一个属性:name 列标签

In:
a=pd.Series(np.arange(6),index=[1,4,4,4,5,6],name=int)
print(a)
print(a.name)
b = a.rename("int2")  ##更改属性
print(b.name)

Out:
1    0
4    1
4    2
4    3
5    4
6    5
Name: <class 'int'>, dtype: int32
<class 'int'>
int2

数据帧

数据帧是一种二维标记数据结构,其列 可能不同的类型,

与系列一样,数据帧可以介绍不同类型的输入

  • 一维数组、列表、字典或系列的字典
  • 2-D numpy.ndarray
  • 结构化或记录阵列
  • A系列
  • 另一个数据帧

从系列或字典的字典输入

In:
a = pd.Series([1,2,3,4],index=["a","b","c","d"])
b = pd.DataFrame(a)
print(b)

Out:
   0
a  1
b  2
c  3
d  4

系列输入

In:
a ={
    "one" : pd.Series([1,2,3,4,5],index=["a","b","c","d","e"]) ,
    "two" : pd.Series([5,6,7,8,9],index=["a","b","c","d","e"])
}
b=pd.DataFrame(a)
print(b)

Out:
   one  two
a    1    5
b    2    6
c    3    7
d    4    8
e    5    9

字典输入

可以通过index,columns 改变行列顺序

In:
a ={
    "one" : pd.Series([1,2,3,4],index=["a","b","c","d"]) ,
    "two" : pd.Series([5,6,7,8,9],index=["a","b","c","d","e"])
}
b=pd.DataFrame(a)
b=pd.DataFrame(a)
c=pd.DataFrame(a,index=["e","d","c","b","a"],columns=["two","one"])
print(c)

Out:
   two  one
e    9    NaN
d    8    4
c    7    3
b    6    2
a    5    1

缺行会被补齐,NaN

从 ndarrays / list 的字典

In:
d = {"one": [1.0, 2.0, 3.0, 4.0], "two": [4.0, 3.0, 2.0, 1.0]}
print(pd.DataFrame(d))
print(pd.DataFrame(d, index=["a", "b", "c", "d"]))

Out:
   one  two
a  1.0  4.0
b  2.0  3.0
c  3.0  2.0
d  4.0  1.0

从结构化或记录数组

从字典列表

In:
data2 = [{"a": 1, "b": 2}, {"a": 5, "b": 10, "c": 20}]
print(pd.DataFrame(data2))
print(pd.DataFrame(data2, index=["first", "second"]))
print(pd.DataFrame(data2, columns=["a", "b"]))

Out:
   a   b     c
0  1   2   NaN
1  5  10  20.0
        a   b     c
first   1   2   NaN
second  5  10  20.0
   a   b
0  1   2
1  5  10

来自元组的字典

从系列

In:
ser = pd.Series(range(3), index=list("abc"), name="ser")
print(pd.DataFrame(ser))

Out:
   ser
a    0
b    1
c    2

从命名元组列表

从数据类列表

备用构造函数

列选择、添加、删除

与系列类似,数据帧也能实现 数据帧内列于列,和数据帧与数据帧之间 的+ - * 比较,
可以像字典一样删除或弹出列:del pop

del df["two"]
three = df.pop("three")

当插入标量值时,它自然会被传播以填充 列:

In:
a ={
    "one" : pd.Series([1,2,3],index=["a","b","c"]) ,
    "two" : pd.Series([5,6,7,8,9],index=["a","b","c","d","e"])
}
b=pd.DataFrame(a)
b["there"]=1
print(b)

Out:
   one  two  there
a  1.0    5      1
b  2.0    6      1
c  3.0    7      1
d  NaN    8      1
e  NaN    9      1

插入与数据帧没有相同索引的系列时,它 将符合数据帧的索引:

In:
a ={
    "one" : pd.Series([1,2,3],index=["a","b","c"]) ,
    "two" : pd.Series([5,6,7,8,9],index=["a","b","c","d","e"])
}

b=pd.DataFrame(a)
b["there"]=b["one"][:2]
print(b)

Out:
   one  two  there
a  1.0    5    1.0
b  2.0    6    2.0
c  3.0    7    NaN
d  NaN    8    NaN
e  NaN    9    NaN

在方法链中分配新列

索引/选择

操作语法结果
选择列df[col]系列
按标签选择行df.loc[label]系列
按整数位置选择行df.iloc[loc]系列
切片行df[5:10]数据帧
按布尔向量选择行df[bool_vec]数据帧

数据对齐和算术

转置

DataFrame.transpose()
###数据帧与 NumPy 函数的互操作性
大多数 NumPy 函数可以直接在 Series 和数据帧上调用

控制台显示

非常大的数据帧将被截断以在控制台中显示它们,还可以使用 info() 获取摘要。

使用 DataFrame.to_string() 将以表格形式返回数据帧的字符串表示形式,尽管它并不总是适合控制台宽度:

您可以通过设置以下选项来更改单行上的打印量:display.width

您可以通过设置来调整各个列的最大宽度display.max_colwidth

数据帧列属性访问和 IPython

如果数据帧列标签是有效的 Python 变量名称,则该列可以是 像属性一样访问:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嚄825

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值