Pandas 数据结构Dataframe:基本概念及创建
"二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值、字符串、布尔值等。
Dataframe中的数据以一个或多个二维块存放,不是列表、字典或一维数组结构。
1. Dataframe的数据结构
# Dataframe 数据结构 # Dataframe是一个表格型的数据结构,“带有标签的二维数组”。 # Dataframe带有index(行标签)和columns(列标签) data = {'name':['Jack','Tom','Mary'], 'age':[18,19,20], 'gender':['m','m','w']} frame = pd.DataFrame(data) print(frame,'\n') print(type(frame),'\n') print(frame.index,'\n该数据类型为:',type(frame.index),'\n') print(frame.columns,'\n该数据类型为:',type(frame.columns),'\n') print(frame.values,'\n该数据类型为:',type(frame.values),'\n') # 查看数据,数据类型为dataframe # .index查看行标签 # .columns查看列标签 # .values查看值,数据类型为ndarray
输出结果:
age gender name 0 18 m Jack 1 19 m Tom 2 20 w Mary <class 'pandas.core.frame.DataFrame'> RangeIndex(start=0, stop=3, step=1) 该数据类型为: <class 'pandas.indexes.range.RangeIndex'> Index(['age', 'gender', 'name'], dtype='object') 该数据类型为: <class 'pandas.indexes.base.Index'> [[18 'm' 'Jack'] [19 'm' 'Tom'] [20 'w' 'Mary']] 该数据类型为: <class 'numpy.ndarray'>
2.数据结构其他注意的地方
print(frame,'\n') print(frame.columns.tolist(),'\n') #查看列名 print(frame.values,'\n') #嵌套列表 print(frame.values.tolist())
输出结果:
age gender name 0 18 m Jack 1 19 m Tom 2 20 w Mary ['age', 'gender', 'name'] [[18 'm' 'Jack'] [19 'm' 'Tom'] [20 'w' 'Mary']] [[18, 'm', 'Jack'], [19, 'm', 'Tom'], [20, 'w', 'Mary']]
3. #Series 与 Dataframe的关系 其实就是Dataframe的一列
age = frame['age'] #列的索引 print(age) print(type(age))
输出结果:
0 18 1 19 2 20 Name: age, dtype: int64 <class 'pandas.core.series.Series'>
二. DataFrame 的创建方法
1.由数组/list组成的字典
# Dataframe 创建方法一:由数组/list组成的字典 # 创建方法:pandas.Dataframe() data1 = {'a':[1,2,3], 'b':[3,4,5], 'c':[5,6,7]} data2 = {'one':np.random.rand(3), 'two':np.random.rand(3)} # 这里如果尝试 'two':np.random.rand(4) 会怎么样? print(data1) print(data2) df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) print(df1) print(df2) # 由数组/list组成的字典 创建Dataframe,columns为字典key,index为默认数字标签 # 字典的值的长度必须保持一致! df1 = pd.DataFrame(data1, columns = ['b','c','a','d']) print(df1) df1 = pd.DataFrame(data1, columns = ['b','c']) print(df1) # columns参数:可以重新指定列的顺序,格式为list,如果现有数据中没有该列(比如'd'),则产生NaN值 # 如果columns重新指定时候,列的数量可以少于原数据 df1['s'] = 10 #添加列 print(df1) del df1['s'] #删除列 print(df1) df2 = pd.DataFrame(data2, index = ['f1','f2','f3']) # 这里如果尝试 index = ['f1','f2','f3','f4'] 会怎么样?——》会报错 print(df2) # index参数:重新定义index,格式为list,长度必须保持一致 添加列没事,添加标签就不行了
输出结果:
{'b': [3, 4, 5], 'a': [1, 2, 3], 'c': [5, 6, 7]} {'one': array([0.53592778, 0.1429434 , 0.40188575]), 'two': array([0.59196586, 0.40463609, 0.66488198])} a b c 0 1 3 5 1 2 4 6 2 3 5 7 one two 0 0.535928 0.591966 1 0.142943 0.404636 2 0.401886 0.664882 b c a d 0 3 5 1 NaN 1 4 6 2 NaN 2 5 7 3 NaN b c 0 3 5 1 4 6 2 5 7 b c s 0 3 5 10 1 4 6 10 2 5 7 10 b c 0 3 5 1 4 6 2 5 7 one two f1 0.535928 0.591966 f2 0.142943 0.404636 f3 0.401886 0.664882
2. # Dataframe 创建方法二:由Series组成的字典
# Dataframe 创建方法二:由Series组成的字典 data1 = {'one':pd.Series(np.random.rand(2)), 'two':pd.Series(np.random.rand(3))} # 没有设置index的Series data2 = {'one':pd.Series(np.random.rand(2), index = ['a','b']), 'two':pd.Series(np.random.rand(3),index = ['a','b','c'])} # 设置了index的Series print(data1) print(data2) df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2) print(df1) print(df2) # 由Seris组成的字典 创建Dataframe,columns为字典key,index为Series的标签(如果Series没有指定标签,则是默认数字标签) # Series可以长度不一样,生成的Dataframe会出现NaN值
输出结果:
{'two': 0 0.331382 1 0.508265 2 0.615997 dtype: float64, 'one': 0 0.857739 1 0.165800 dtype: float64} {'two': a 0.826446 b 0.983392 c 0.187749 dtype: float64, 'one': a 0.920073 b 0.215178 dtype: float64} one two 0 0.857739 0.331382 1 0.165800 0.508265 2 NaN 0.615997 one two a 0.920073 0.826446 b 0.215178 0.983392 c NaN 0.187749
3.# Dataframe 创建方法三:通过二维数组直接创建
# Dataframe 创建方法三:通过二维数组直接创建 ar = np.random.rand(9).reshape(3,3) print(ar) df1 = pd.DataFrame(ar) df2 = pd.DataFrame(ar, index = ['a', 'b', 'c'], columns = ['one','two','three']) # 可以尝试一下index或columns长度不等于已有数组的情况 print(df1) print(df2) # 通过二维数组直接创建Dataframe,得到一样形状的结果数据,如果不指定index和columns,两者均返回默认数字格式 # index和colunms指定长度与原数组保持一致
输出结果:
[[0.33940056 0.77384698 0.25308293] [0.28151251 0.02875986 0.7516066 ] [0.34746659 0.25245068 0.68979615]] 0 1 2 0 0.339401 0.773847 0.253083 1 0.281513 0.028760 0.751607 2 0.347467 0.252451 0.689796 one two three a 0.339401 0.773847 0.253083 b 0.281513 0.028760 0.751607 c 0.347467 0.252451 0.689796
4.其他注意的地方:
df = pd.DataFrame(np.random.randn(100,3),columns = ['A','B','C']) #后面常用到的 df import matplotlib.pyplot as plt df.plot() plt.show() df.head() #查看表头,默认查看前五条数据
输出结果: