一、Series & DataFrame是什么?
答:
- Series是表格中的一个列,可以保存任何数据类型
- Series = index + data + name(Series=索引+数据+名字)
- DataFrame是多个Series拼接,这些Series共用索引
图形化描述如下图:
二、用程序创建Series
创建Series的API:
pandas.Series( data, index, dtype, name, copy)
- data:数据(ndarray)
- index:数据索引。(默认是从0开始的整数序列)
- dtype:数据类型
- name:名称
- copy:拷贝数据(默认False)
2.1 创建一个Series,只给data
import pandas as pd
# 创建一个Series,只给data
a=['asd','bbb','ccc']
s=pd.Series(a)
print(s)
运行结果:
0 asd
1 bbb
2 ccc
dtype: object
2.2 创建一个Series,给data和index
import pandas as pd
# 创建一个Series,给data和index
a=['asd','bbb','ccc']
ind=['x','y','z']
s=pd.Series(a,ind)
print(s)
print('s[\'y\'] = ',s['y']) # 通过index访问data
运行结果
x asd
y bbb
z ccc
dtype: object
s['y'] = bbb
2.3 用字典创建一个Series
import pandas as pd
# 用字典创建一个Series
a={1:'asd',2:'bbb',3:'ccc'}
s=pd.Series(a,name="Series-Test") #加了name(列名)
print(s)
运行结果
1 asd
2 bbb
3 ccc
Name: Series-Test, dtype: object
2.4 用字典+index 创建一个Series【1】
用字典和index创建一个Series,结果符合我们的常识,但该程序重点在于引出2.5所示情况
import pandas as pd
d = {'a': 1, 'b': 2, 'c': 3}
ser = pd.Series(data=d, index=['a', 'b', 'c'])
print(ser)
运行结果
a 1
b 2
c 3
dtype: int64
2.5 用字典+index 创建一个Series【2】
index首先是用字典中的键构建的。之后,该Series与给定的index重新索引,因此得到结果NaN。
import pandas as pd
d = {'a': 1, 'b': 2, 'c': 3}
ser = pd.Series(data=d, index=['x', 'y', 'c'])
print(ser)
运行结果
x NaN
y NaN
c 3.0
dtype: float64
2.6 copy字段的使用【1】
先行知识:numpy 副本与视图(copy & view)
由于输入数据类型是python中的list,即使copy=False, Series也有原始数据的副本,因此数据没有改变。【应该用numpy中的数据类型,该字段才生效】
import pandas as pd
r = [1, 2]
ser = pd.Series(r, copy=False)
ser.iloc[0] = 999
print(r) # 原始数据没变
print(ser) # Series变了
运行结果
[1, 2]
0 999
1 2
dtype: int64
2.6 copy字段的使用【2】
由于输入数据类型是numpy中的numpy.array,同时copy=False,
故Series有原始数据的视图,
因此修改Series时,原始数据会改变。
import pandas as pd
import numpy as np
r = np.array([1, 2])
ser = pd.Series(r, copy=False)
ser.iloc[0] = 999
print(r) # 原始数据变了
print(ser) # Series变了
运行结果
[999 2]
0 999
1 2
dtype: int32
三、用程序创建DataFrame
pandas.DataFrame(data, index, columns, dtype, copy)
- data: 一组数据(可以是ndarray, series, map, lists, dict)
- index: 索引(行标签)
- columns: 列标签(列名)
- dtype: 数据类型
- copy:数据是否是原始数据的副本,默认为False
3.1 用字典构造DataFrame。
import pandas as pd
d = {
'col1': [1, 2], # 列名:该列的数据
'col2': [3, 4]
}
df = pd.DataFrame(data=d,index=['a','b']) # 指定索引为a,b
print(df)
print()
print(df.dtypes) # 查看数据类型
运行结果
col1 col2
a 1 3
b 2 4
col1 int64
col2 int64
dtype: object
3.2 用字典构造DataFrame,并指定数据类型。
import pandas as pd
import numpy as np
d = {
'col1': [1, 2], # 列名:该列的数据
'col2': [3, 4]
}
df = pd.DataFrame(data=d,index=['a','b'],dtype=np.int8) # 指定索引为a,b。指定数据类型为8位int
print(df)
print()
print(df.dtypes) # 查看数据类型
运行结果
col1 col2
a 1 3
b 2 4
col1 int8
col2 int8
dtype: object
3.3 从包含Series的字典中构造DataFrame
import pandas as pd
d={
'col1':[1,2,3,4], # 第一列数据
'col2':pd.Series([2,3],index=[2,3]) # 第二列数据
}
df=pd.DataFrame(data=d,index=[0,1,2,3])
print(df)
运行结果
col1 col2
0 1 NaN
1 2 NaN
2 3 2.0
3 4 3.0
3.4 从numpy narray构造DataFrame
import pandas as pd
import numpy as np
a=np.array([[1,2,3],
[4,5,6],
[7,8,9]]) # 原封不动地摆放
df=pd.DataFrame(a,columns=['x','y','z']) # 指定了列名
print(df)
运行结果
x y z
0 1 2 3
1 4 5 6
2 7 8 9
3.5 从带有标签列的numpy ndarray中构造DataFrame
import pandas as pd
import numpy as np
a=np.array([(1,2,3),(4,5,6),(7,8,9)], # 创建了一个NumPy数组。数组的元素是三个元组:(1,2,3), (4,5,6), (7,8,9)。
dtype=[('a','i4'),('b','i4'),('c','i4')]) # 数组的每个元组实际上是一个记录,其中每个字段都有一个标签('a', 'b', 'c')和相应的数据类型('i4' 代表4字节整数)。
df=pd.DataFrame(a,columns=['c','a']) # 指定了列名
print(df)
运行结果
c a
0 3 1
1 6 4
2 9 7
3.6 从dataclass构造DataFrame
import pandas as pd
import numpy as np
from dataclasses import make_dataclass
Point = make_dataclass("Point", [("x", int), ("y", int)])
df=pd.DataFrame([Point(0, 0), Point(0, 3), Point(2, 3)])
print(df)
运行结果
x y
0 0 0
1 0 3
2 2 3
3.7 从Series/DataFrame构造DataFrame
df1 = pd.DataFrame([1, 2, 3], index=["a", "b", "c"], columns=["x"])
df2 = pd.DataFrame(data=df1, index=["a", "c"])
print(df1)
print(df2)
运行结果
x
a 1
b 2
c 3
x
a 1
c 3