"二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值、字符串、布尔值等。Dataframe中的数据以一个或多个二维块存放,不是列表、字典或一维数组结构。
DataFrame带有index(行标签)和columns(列标签)
示例:
data = {'name':['Jack','Tom','Mary'],
'age':[18,19,20],
'gender':['m','m','w']}
frame = pd.DataFrame(data)
print(frame)
print(type(frame))
print(frame.index,'\n该数据类型为:',type(frame.index))
print(frame.columns,'\n该数据类型为:',type(frame.columns))
print(frame.values,'\n该数据类型为:',type(frame.values))
=================================
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.core.indexes.range.RangeIndex'>
Index(['age', 'gender', 'name'], dtype='object')
该数据类型为: <class 'pandas.core.indexes.base.Index'>
[[18 'm' 'Jack']
[19 'm' 'Tom']
[20 'w' 'Mary']]
该数据类型为: <class 'numpy.ndarray'>
Dataframe 创建方法
方法1:由数组/list组成的字典
由数组/list组成的字典 创建Dataframe,columns为字典key,index为默认数字标签,同时要求每个字典内值的长度保存一致。
data1 = {'a':[1,2,3],
'b':[3,4,5],
'c':[5,6,7]}
data2 = {'one':np.random.rand(3),
'two':np.random.rand(3)}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
print(df1)
print(df2)
=========================
a b c
0 1 3 5
1 2 4 6
2 3 5 7
one two
0 0.127220 0.524514
1 0.782480 0.663941
2 0.599586 0.846812
columns参数:可以重新指定列的顺序,格式为list,如果现有数据中没有该列(比如’d’),则产生NaN值。
df1 = pd.DataFrame(data1, columns = ['b','c','a','d'])
print(df1)
df1 = pd.DataFrame(data1, columns = ['b','c'])
print(df1)
=========================
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
index参数:重新定义index,格式为list,长度必须与数据的行数保持一致
df2 = pd.DataFrame(data2, index = ['f1','f2','f3'])
# 这里如果尝试 index = ['f1','f2','f3','f4'] 会报错
print(df2)
=========================
one two
f1 0.127220 0.524514
f2 0.782480 0.663941
f3 0.599586 0.846812
方法2:由Series组成的字典
由Seris组成的字典 创建Dataframe,columns为字典key,index为Series的标签(如果Series没有指定标签,则是默认数字标签)。Series可以长度不一样,生成的Dataframe会自动填充NaN值。
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
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
print(df1)
print(df2)
=========================
one two
0 0.640470 0.101404
1 0.161086 0.018993
2 NaN 0.196439
one two
a 0.596995 0.298154
b 0.598786 0.042650
c NaN 0.961661
方法3:通过二维数组直接创建
先创建数据,再指定行列(如果不指定,会默认用数字标签表示行列号)
array = np.random.rand(9).reshape(3,3)
df1 = pd.DataFrame(array)
print(df1)
=========================
0 1 2
0 0.915834 0.921198 0.421943
1 0.344087 0.423434 0.286973
2 0.122821 0.663230 0.945398
# 指定行列标签时,需要保证行列长度和数据量一致
df2 = pd.DataFrame(data = array,index = list('abc'),columns = list('def'))
print(df2)
=========================
d e f
a 0.915834 0.921198 0.421943
b 0.344087 0.423434 0.286973
c 0.122821 0.663230 0.945398
方法4:由字典组成的列表
源数据为字典列表,一个字典表示一行数据。
由字典组成的列表创建Dataframe,columns为字典的key,index不做指定则为默认数组标签。
data = [{'one': 1, 'two': 2}, {'one': 5, 'two': 10, 'three': 20}]
df1 = pd.DataFrame(data)
df2 = pd.DataFrame(data, index = ['a','b'])
df3 = pd.DataFrame(data, columns = ['one','two'])
print(df1)
print(df2)
print(df3)
=========================
one three two
0 1 NaN 2
1 5 20.0 10
one three two
a 1 NaN 2
b 5 20.0 10
one two
0 1 2
1 5 10
方法5:由字典组成的字典
由字典组成的字典创建Dataframe,columns为字典的key,index为子字典的key。
columns参数可以增加和减少现有列,如出现新的列,填充值为NaN。
index在这里和之前不同,并不能改变原有index,如果指向新的标签,值为NaN (非常重要!)
data = {'Jack':{'math':90,'english':89,'art':78},
'Marry':{'math':82,'english':95,'art':92},
'Tom':{'math':78,'english':67}}
df1 = pd.DataFrame(data)
print(df1)
=========================
Jack Marry Tom
art 78 92 NaN
english 89 95 67.0
math 90 82 78.0
df2 = pd.DataFrame(data, columns = ['Jack','Tom','Bob'])
df3 = pd.DataFrame(data, index = ['a','b','c'])
print(df2)
print(df3)
=========================
Jack Tom Bob
art 78 NaN NaN
english 89 67.0 NaN
math 90 78.0 NaN
Jack Marry Tom
a NaN NaN NaN
b NaN NaN NaN
c NaN NaN NaN