【数据分析】pandas( 二)

目录

简介:

一,1.1来自Series字典或字典

[1.2 来自ndarray或者列表的字典:](#1.2 来自ndarray或者列表的字典:)

1.3来自结构化或记录数组;

1.4来自字典列表:

1.4来自元组的字典:

[1.5 来自Series](#1.5 来自Series)

二,代替构造函数:

2.1DataFrame.from_dict

2.2DataFrame.from_records

三,列表的选择,删除,添加

四,在方法链中分配新列

五,索引

六,数据对齐:


简介:

本片文章我们来介绍pandas的另一个数据类型DataFrame

DataFrame是一个二维标记数据结构,其中包含可能不同类型的列。您可以将其视为电子表格或SQL表,或者Series对象的字典。它通常是最常用的pandas对象。与Series一样,DataFrame接受许多不同类型的输入:

一维ndarray,列表,字典,或字典的Series

二维numpy.ndarray

结构化或记录数组

一个Series

其他DataFrame等

除了数据之外,您还可以选择传递索引(行标签)和列(列标签)参数。如果您传递索引和/或列,则可以保证生成的DataFrame的索引和/或列。因此,Series的字典加上特定索引将丢弃所有与传递的索引不匹配的数据。如果未传递轴标签,他们将根据常识规则从输入数据构建。

一,1.1来自Series字典或字典

生成的索引将是各个系列的索引的并集。如果有任何嵌套字典他们将首先转化为系列。如果每日有传递列,则列将是字典键的有序列表。

d={

"one":pd.Series(1.0,2.0,3.0,index="a","b","c"),

"two":pd.Series(1.0,2.0,3.0,4.0,index="a","b","c","d"),

}

df = pd.DataFrame(d)

复制代码
 one  two
a  1.0  1.0
b  2.0  2.0
c  3.0  3.0
d  NaN  4.0
复制代码
pd.DataFrame(d, index=["d", "b", "a"])
复制代码
  one  two
d  NaN  4.0
b  2.0  2.0
a  1.0  1.0
复制代码
pd.DataFrame(d, index=["d", "b", "a"], columns=["two", "three"])
复制代码
two three
d  4.0   NaN
b  2.0   NaN
a  1.0   NaN

可以通过访问index喝columns属性来分别访问行和列 标签:

df.index

Out: Index('a', 'b', 'c', 'd', dtype='object')

df.columns

Out: Index('one', 'two', dtype='object')

1.2 来自ndarray或者列表的字典:

ndarray的长度必须相同。如果传递索引,他也必须与数组的长度相同,如果没有传递索引,结果将为range(n),n为数组长度。

复制代码
d = {"one": [1.0, 2.0, 3.0, 4.0], "two": [4.0, 3.0, 2.0, 1.0]}
复制代码
pd.DataFrame(d)
复制代码
pd.DataFrame(d, index=["a", "b", "c", "d"])
复制代码
one  two
0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0
复制代码
one  two
a  1.0  4.0
b  2.0  3.0
c  3.0  2.0
d  4.0  1.0

1.3来自结构化或记录数组;

这种情况的处理方式与数组字典相同

data = np.zeros((2,), dtype=("A", "i4"), ("B", "f4"), ("C", "a10"))

data: = (1, 2.0, "Hello"), (2, 3.0, "World")

pd.DataFrame(data)

A B C

0 1 2.0 b'Hello'

1 2 3.0 b'World'

pd.DataFrame(data, index="first", "second")

A B C

first 1 2.0 b'Hello'

second 2 3.0 b'World'

pd.DataFrame(data, columns="C", "A", "B")

C A B

0 b'Hello' 1 2.0

1 b'World' 2 3.0

1.4来自字典列表:

data2 = {"a": 1, "b": 2}, {"a": 5, "b": 10, "c": 20}

pd.DataFrame(data2)

a b c

0 1 2 NaN

1 5 10 20.0

pd.DataFrame(data2, index="first", "second")

a b c

first 1 2 NaN

second 5 10 20.0

pd.DataFrame(data2, columns="a", "b")

a b

0 1 2

1 5 10

1.4来自元组的字典:

可以通过传递元组字典来自动创建MultiIndexed frame

pd.DataFrame(

{

("a", "b"): {("A", "B"): 1, ("A", "C"): 2},

("a", "a"): {("A", "C"): 3, ("A", "B"): 4},

("a", "c"): {("A", "B"): 5, ("A", "C"): 6},

("b", "a"): {("A", "C"): 7, ("A", "B"): 8},

("b", "b"): {("A", "D"): 9, ("A", "B"): 10},

}

)

a b

b a c a b

A B 1.0 4.0 5.0 8.0 10.0

C 2.0 3.0 6.0 7.0 NaN

D NaN NaN NaN NaN 9.0

1.5 来自Series

结果将是一个与输入Series具有相同索引的DataFrame,并且其中一列的名称是Series的原始名称(仅当 为提供其他列名称时)

ser = pd.Series(range(3), index=list("abc"), name="ser")

pd.DataFrame(ser)

ser

a 0

b 1

c 2

二,代替构造函数:

2.1DataFrame.from_dict

DataFrame.from_dict()接受一个字典或一个近似数组序列的字典并返回一个DataFrame。他的操作类似于DataFrame构造函数,除了默认 orient参数是columns之外,还可以设置该参数index使用字典键作为行标签。

pd.DataFrame.from_dict(dict(("A", \[1, 2, 3), ("B", 4, 5, 6)]))

A B

0 1 4

1 2 5

2 3 6

通过orient='index' 键将是行标签。在这种情况下,还可以传递所需列的名称。

pd.DataFrame.from_dict(

dict(("A", \[1, 2, 3), ("B", 4, 5, 6)]),

orient="index",

columns="one", "two", "three",

one two three

A 1 2 3

B 4 5 6

2.2DataFrame.from_records

DataFrame.from_records()接收元组列表或具有结构化数据类型的ndarray。他的工作方式与普通DataFrame构造函数类似,只是生成的DataFrame 索引可能是结构化数据类型的特定字段。

data

array((1, 2., b'Hello'), (2, 3., b'World'),

dtype=('A', '\)

pd.DataFrame.from_records(data, index="C")

A B

C

b'Hello' 1 2.0

b'World' 2 3.0

三,列表的选择,删除,添加

可以将DataFrame语义视为相似索引Series对象的字典。获取设置和删除列的语法与类似的dict操作相同

df"one"

a 1.0

b 2.0

c 3.0

d NaN

Name: one, dtype: float64

df"three" = df"one" * df"two"

df"flag" = df"one" > 2

df

one two three flag

a 1.0 1.0 1.0 False

b 2.0 2.0 4.0 False

c 3.0 3.0 9.0 True

d NaN 4.0 NaN False

也可以像字典一样删除或弹出列:

del df"two"

three = df.pop("three")

df

one flag

a 1.0 False

b 2.0 False

c 3.0 True

d NaN False

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

df"foo" = "bar"

df

one flag foo

a 1.0 False bar

b 2.0 False bar

c 3.0 True bar

d NaN False bar

当插入与Series不具有相同索引的DataFrame时,他将符合DataFrame的索引

Idf"one_trunc" = df"one":2

I df

one flag foo one_trunc

a 1.0 False bar 1.0

b 2.0 False bar 2.0

c 3.0 True bar NaN

d NaN False bar NaN

四,在方法链中分配新列

DataFrame中有一种assign()方法可以轻松创建可能从现有列派生的新列

iris = pd.read_csv("data/iris.data")

iris.head()

SepalLength SepalWidth PetalLength PetalWidth Name

0 5.1 3.5 1.4 0.2 Iris-setosa

1 4.9 3.0 1.4 0.2 Iris-setosa

2 4.7 3.2 1.3 0.2 Iris-setosa

3 4.6 3.1 1.5 0.2 Iris-setosa

4 5.0 3.6 1.4 0.2 Iris-setosa

iris.assign(sepal_ratio=iris"SepalWidth" / iris"SepalLength").head()

SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio

0 5.1 3.5 1.4 0.2 Iris-setosa 0.686275

1 4.9 3.0 1.4 0.2 Iris-setosa 0.612245

2 4.7 3.2 1.3 0.2 Iris-setosa 0.680851

3 4.6 3.1 1.5 0.2 Iris-setosa 0.673913

4 5.0 3.6 1.4 0.2 Iris-setosa 0.720000

在上面的示例中,我们插入了一个预先计算的值。我们还可以传入一个只有一个参数的函数,以便在分配给的DataFrame上进行计算。

iris.assign(sepal_ratio=lambda x: (x"SepalWidth" / x"SepalLength")).head()

SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio

0 5.1 3.5 1.4 0.2 Iris-setosa 0.686275

1 4.9 3.0 1.4 0.2 Iris-setosa 0.612245

2 4.7 3.2 1.3 0.2 Iris-setosa 0.680851

3 4.6 3.1 1.5 0.2 Iris-setosa 0.673913

4 5.0 3.6 1.4 0.2 Iris-setosa 0.720000

assign()始终返回数据的副本,保持原始的DataFrame不变。

五,索引

|-----------|-----------------|-----------|
| 选择 | 语法 | 结果 |
| 选择列 | dfcol | Series |
| 按标签选择行 | df.loclabel | Series |
| 按整数位置选择行 | df.ilocloc | Series |
| 切片行 | df5:10 | DataFrame |
| 通过布尔向量选择行 | dfbool_vec | DataFrame |

例如,行选择返回一个Series,其索引是DataFrame的列

df.loc"b"

one 2.0

bar 2.0

flag False

foo bar

one_trunc 2.0

Name: b, dtype: object

df.iloc2

one 3.0

bar 3.0

flag True

foo bar

one_trunc NaN

Name: c, dtype: object

六,数据对齐:

对象之间的数据对齐会在列和索引DataFrame上自动对齐,同样,生成的对象将具有列标签和行标签的并集

df = pd.DataFrame(np.random.randn(10, 4), columns="A", "B", "C", "D")In 95: df2 = pd.DataFrame(np.random.randn(7, 3), columns="A", "B", "C")

df + df2

A B C D

0 0.045691 -0.014138 1.380871 NaN

1 -0.955398 -1.501007 0.037181 NaN

2 -0.662690 1.534833 -0.859691 NaN

3 -2.452949 1.237274 -0.133712 NaN

4 1.414490 1.951676 -2.320422 NaN

5 -0.494922 -1.649727 -1.084601 NaN

6 -1.047551 -0.748572 -0.805479 NaN

7 NaN NaN NaN NaN

8 NaN NaN NaN NaN

9 NaN NaN NaN NaN

DataFrame和Series之间执行操作时,默认行为是对齐列上的索引,从而按行广播,

df - df.iloc0

A B C D

0 0.000000 0.000000 0.000000 0.000000

1 -1.359261 -0.248717 -0.453372 -1.754659

2 0.253128 0.829678 0.010026 -1.991234

3 -1.311128 0.054325 -1.724913 -1.620544

4 0.573025 1.500742 -0.676070 1.367331

5 -1.741248 0.781993 -1.241620 -2.053136

6 -1.240774 -0.869551 -0.153282 0.000430

7 -0.743894 0.411013 -0.929563 -0.282386

8 -1.194921 1.320690 0.238224 -1.482644

9 2.293786 1.856228 0.773289 -1.446531

相关推荐
hboot4 天前
AI工程师第二课 - 数据处理
人工智能·python·数据分析
王小王-1235 天前
基于 Hive 的网易云音乐数据分析及可视化系统
hive·hadoop·数据分析·音乐数据分析·网易云音乐分析·hive音乐分析·hadoop网易云
Database_Cool_5 天前
大规模数据分析降本指南:AnalyticDB Serverless 弹性架构实战
数据仓库·阿里云·架构·数据分析·serverless
YangYang9YangYan5 天前
2026初入职场学习数据分析的价值
学习·数据挖掘·数据分析
有Li6 天前
PTCMIL:基于提示 token 聚类的全切片图像多实例学习分析文献速递/多模态医学影像最新进展
论文阅读·学习·数据挖掘·聚类·文献·医学生
数睿数据无代码开发6 天前
打破数据孤岛:深度解析 smardaten 数据连接器核心功能
数据挖掘·无代码
砚底藏山河6 天前
沪深A股:如何获取基金持股数据
java·python·数据分析·maven
jarreyer6 天前
【数据分析绘图】excel绘图和bi工具区别
数据挖掘·数据分析·excel
装不满的克莱因瓶6 天前
了解多标签图像分类方法——从Sigmoid输出到真实世界复杂视觉理解
人工智能·pytorch·python·深度学习·机器学习·分类·数据挖掘