DataFrame的每一列数据都可以看成一个Series结构,只不过,DataFrame为每列数据值增加了一个列标签。因此DataFrame其实是从Series的基础上演变而来,并且他们有相同的标签,在数据分析任务中DataFrame的应用非常广泛,因为它描述数据的更为清晰、直观。
以一个学生表为例:
下面对 DataFrame数据结构的特点做简单地总结,
index:行标签,如果没有传递index值,则默认行标签是Rangelndex(0,1,2,…,n)
columns:列标签,如果没有传递columns值,则默认列标签是Rangelndex(0,1,…,n)
dtype:数据类型,dtype只能设置一个,设置多个列的数据类型需要使用其他方式。
import pandas as pd
import numpy as np
a=np.arange(5)
df=pd.DataFrame(a) # 不设置列标签默认从0开始递增
print(df)
# 嵌套创建数据,列表中每个元素代表一行数据
data = [['a', 90],['b', 50],['c', 75]]
df=pd.DataFrame(data,columns=['Name','Score']) # 设置列称签
print(df)
'''
0
0 0
1 1
2 2
3 3
4 4
Name Score
0 a 90
1 b 50
2 c 75
'''
# dtype不能设置多个值,否则会报错
# df=pd.DataFrame(data,columns=['Name','Score'],dtype=[str,int])
'''
TypeError: Field elements must be 2- or 3-tuples, got ''
'''
df = pd.DataFrame(data,columns=['Name','Score'],dtype=str)
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data,index=['x','y']) #设置行标签
print(df)
'''
a b c
x 1 2 NaN
y 5 10 20.0
'''
df2=pd.DataFrame(data,index=['x','y'],columns=['c','a']) # 设定展示列
print(df2)
'''
c a
x NaN 1
y 20.0 5
'''
N a N NaN NaN默认为浮点类型。
d = {'one': pd.Series([1,2,3], index=['a','b','k']),
'two': pd.Series([1,2,3,4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame (d)
print(df)
'''
one two
a 1.0 1.0
b 2.0 2.0
c NaN 3.0
d NaN 4.0
k 3.0 NaN
'''
data = {'Name':['关羽','刘备','张飞','曹操'],'Age':[28,34,29,42]}
index = ["rank1", "rank2","rank3","rank4"] # 设定行标签
df = pd.DataFrame(data,index=index) # 通过字典创建DataFrame
print(df)
print ("========df['Name']:取得Name列================")
print(df['Name'])
print("=========df['Age']:取得Age列================")
print(df['Age'])
print("=========df[['Name','Age']]:取得多列==============")
print(df[['Name','Age']])
# 注意列不能使用切片选取多列,否则会返回空DataFrame
print("=========df['Name':'Age']:切片不能取得多列==============")
print(df['Name':'Age'])
'''
Name Age
rank1 关羽 28
rank2 刘备 34
rank3 张飞 29
rank4 曹操 42
========df['Name']:取得Name列================
rank1 关羽
rank2 刘备
rank3 张飞
rank4 曹操
Name: Name, dtype: object
=========df['Age']:取得Age列================
rank1 28
rank2 34
rank3 29
rank4 42
Name: Age, dtype: int64
=========df['Name','Age']:取得多列==============
Name Age
rank1 关羽 28
rank2 刘备 34
rank3 张飞 29
rank4 曹操 42
=========df['Name':'Age']:切片不能取得多列==============
Empty DataFrame
Columns: [Name, Age]
Index: []
'''
# 通过df['列名']=pd.Series() 添加列
df['Score']=pd.Series([89,21,68],index=["rank1", "rank2","rank4"])
# 列之间的运算操作
df['Age+Score']=df['Age']+df['Score']
print(df)
'''
Name Age Score Age+Score
rank1 关羽 28 89.0 117.0
rank2 刘备 34 21.0 55.0
rank3 张飞 29 NaN NaN
rank4 曹操 42 68.0 110.0
'''
# 通过()insert函数在DataFrame中插入列
# df.insert(loc,column,value,allow_duplicates=False) loc:整型,插入的位置,必须验证0<=loc<=len (列)
info=[["王杰",18],["李杰",19],["刘杰",17]]
df=pd.DataFrame(info,columns=["name","age"])
print(df)
#数值1代表插入到coluans列表的索引位置
df.insert(2,column='score',value=[91,90,75])
print("-----df.insert插入数据:-------")
print(df)
# allow_duplicates=True 代表可以插入重复的列
df.insert(2,column='score',value=[91,90,75],allow_duplicates=True)
print("-----df.insert插入重复的列数据:-------")
print(df)
'''
name age
0 王杰 18
1 李杰 19
2 刘杰 17
-----df.insert插入数据:-------
name age score
0 王杰 18 91
1 李杰 19 90
2 刘杰 17 75
-----df.insert插入重复的列数据:-------
name age score score
0 王杰 18 91 91
1 李杰 19 90 90
2 刘杰 17 75 75
'''
data = {'Name':['关羽','刘备','张飞','曹操'],'Age':[28,34,29,42]}
index = ["rank1", "rank2","rank3","rank4"] # 设定行标签
df = pd.DataFrame(data,index=index) # 通过字典创建DataFrame
print ("========df:初始的DataFrame================")
print(df)
# pop(name) 弹出名为Name的列,可以把弹出的元素赋值给一个变量
df2=df.pop('Name')
print ("========df2:弹出的Name列================")
print(df2)
print ("========df:剩下的DataFrame=================")
print(df)
# del 删除列
print ("========df:剩下的DataFrame=================")
del df['Age']
print(df)
'''
========df:初始的DataFrame================
Name Age
rank1 关羽 28
rank2 刘备 34
rank3 张飞 29
rank4 曹操 42
========df2:弹出的Name列================
rank1 关羽
rank2 刘备
rank3 张飞
rank4 曹操
Name: Name, dtype: object
========df:剩下的DataFrame=================
Age
rank1 28
rank2 34
rank3 29
rank4 42
========df:剩下的DataFrame=================
Empty DataFrame
Columns: []
Index: [rank1, rank2, rank3, rank4]
'''
info=[["王杰",18],["李杰",19],["刘杰",17]]
df=pd.DataFrame(info,columns=["name","age"],index=['b','c','a'])
# loc使用标签获取行数据
print(df.loc['b'])
# loc允许接受两个参数分别是行和列
print(df.loc['b','age'])
# 行和列还可以使用切片
print(df.loc['b':'a','age'])
# 取单独几列几行的数据
print(df.loc[['b','a'],['name']])
'''
name 王杰
age 18
Name: b, dtype: object
18
b 18
c 19
a 17
Name: age, dtype: int64
name
b 王杰
a 刘杰
'''
# iloc 使用索引查找数据
print(df.iloc[0])
# iloc允许接受两个参数分别是行和列
print(df.iloc[0,1])
# 行和列还可以使用切片
print(df.iloc[0:3,1])
# 取单独某几行某几列的数据
print(df.iloc[[0,2],[0]])
'''
name 王杰
age 18
Name: b, dtype: object
18
b 18
c 19
a 17
Name: age, dtype: int64
name
b 王杰
a 刘杰
'''
info=[["王杰",18],["李杰",19],["刘杰",17]]
df=pd.DataFrame(info,columns=["name","age"])
print ("========df:初始的DataFrame================")
print(df)
df2=df.T
print ("========df2:df转置后的DataFrame================")
print(df2)
# axes 返回一个行标签、列标签组成的列表。
print(df.axes)
# 返回每一列属性Series的数据类型。
print(df.dtypes)
'''
========df:初始的DataFrame================
name age
0 王杰 18
1 李杰 19
2 刘杰 17
========df2:df转置后的DataFrame================
0 1 2
name 王杰 李杰 刘杰
age 18 19 17
[RangeIndex(start=0, stop=3, step=1), Index(['name', 'age'], dtype='object')]
name object
age int64
dtype: object
'''
# 修改行标签
print(df.rename(index={'rank1':"r2",'rank3':"r3"}))
# 修改列标签
print(df.rename(columns={'Name':'n','Age':'a'}))
print(df)
# inplace=True时,会修改源数据
df.rename(index={'rank1':"r2",'rank3':"r3"},columns={'Name':'n','Age':'a'},inplace=True)
print(df)
'''
Name Age
r2 关羽 28
rank2 刘备 34
r3 张飞 29
rank4 曹操 42
n a
rank1 关羽 28
rank2 刘备 34
rank3 张飞 29
rank4 曹操 42
Name Age
rank1 关羽 28
rank2 刘备 34
rank3 张飞 29
rank4 曹操 42
n a
r2 关羽 28
rank2 刘备 34
r3 张飞 29
rank4 曹操 42
'''
# info() 输出该DataFrame的基本信息
print ("========df的摘要信息================")
print(df.info())
'''
========df的摘要信息================
Index: 4 entries, r2 to rank4
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 n 4 non-null object
1 a 4 non-null int64
dtypes: int64(1), object(1)
memory usage: 96.0+ bytes
None
'''
作用:默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
注意: df.sort_index()可以完成和df.sort_values()完全相同的功能,
但python更推荐用只用df.sort_index()对“根据行标签"和"根据列标签"排序,其他排序方式用df.sort_values()。
df = pd.DataFrame({'b':[1,2,2,3], 'a':[4,3,2,1],'c':[1,3,8,2]},index=[2,0,1,3])
print ("========源df================")
print(df)
# 默认按“行标签”升序排序,
print ("========行排序df================")
print(df.sort_index())
# 按“列标签”升序排序,并修改数据源 inplace=True
print ("========列排序df================")
df.sort_index(axis=1,inplace=True)
print(df)
'''
========源df================
b a c
2 1 4 1
0 2 3 3
1 2 2 8
3 3 1 2
========行排序df================
b a c
0 2 3 3
1 2 2 8
2 1 4 1
3 3 1 2
========列排序df================
a b c
2 4 1 1
0 3 2 3
1 2 2 8
3 1 3 2
'''
# sort_values() 值排序
print ("========按'a'列的值升序排序================")
print(df.sort_values(by='a'))
print ("========按'b'列的值降序,'c'列的值升序排序================")
print(df.sort_values(by=['b','c'],ascending=[False,True]))
print ("========按2行的值升序排序================")
print(df.sort_values(by=2,axis=1))
print ("========按2行的值升序,1行的值降序排序================")
df.sort_values(by=[2,1],axis=1,ascending=[True,False],inplace=True,kind='quicksort')
print(df)
'''
========按'a'列的值升序排序================
a b c
3 1 3 2
1 2 2 8
0 3 2 3
2 4 1 1
========按'b'列的值降序,'c'列的值升序排序================
a b c
3 1 3 2
0 3 2 3
1 2 2 8
2 4 1 1
========按2行的值升序排序================
b c a
2 1 1 4
0 2 3 3
1 2 8 2
3 3 2 1
========按2行的值升序,1行的值降序排序================
c b a
2 1 1 4
0 3 2 3
1 8 2 2
3 2 3 1
'''
import pandas as pd
df = pd.DataFrame({'Country': ['China', 'China', 'India', 'India', 'America', 'Japan', 'China', 'India'],
'Income': [10000, 10000, 5000, 5002, 40000, 50000, 8000, 5000],
'Age': [28, 23, 25, 26, 40, 25, 45, 23]})
'''
Age Country Income
0 28 China 10000
1 23 China 10000
2 25 India 5000
3 26 India 5002
4 40 America 40000
5 25 Japan 50000
6 45 China 8000
7 23 India 5000
'''
df_gb = df.groupby('Country')
for index, data in df_gb:
print(index)
print(data)
'''
America
Age Country Income
4 250 America 40000
China
Age Country Income
0 5000 China 10000
1 4321 China 10000
6 4500 China 8000
India
Age Country Income
2 1234 India 5000
3 4010 India 5002
7 4321 India 5000
Japan
Age Country Income
5 250 Japan 50000
'''
df_gb = df.groupby(['Country', 'Income'])
for (index1, index2), data in df_gb:
print((index1, index2))
print(data)
'''
('America', 40000)
Age Country Income
4 250 America 40000
('China', 8000)
Age Country Income
6 4500 China 8000
('China', 10000)
Age Country Income
0 5000 China 10000
1 4321 China 10000
('India', 5000)
Age Country Income
2 1234 India 5000
7 4321 India 5000
('India', 5002)
Age Country Income
3 4010 India 5002
('Japan', 50000)
Age Country Income
5 250 Japan 50000
'''
df_agg = df.groupby('Country').agg(['min', 'mean', 'max'])
print(df_agg)
'''
Income Age
min mean max min mean max
Country
America 40000 40000.000000 40000 40 40.000000 40
China 8000 9333.333333 10000 23 32.000000 45
India 5000 5000.666667 5002 23 24.666667 26
Japan 50000 50000.000000 50000 25 25.000000 25
'''
# 查看某一个属性的最小,最大,平均值
df_agg = df.groupby('Country').agg({'Income':['min', 'mean', 'max']})
print(df_agg)
'''
Income
min mean max
Country
America 40000 40000.000000 40000
China 8000 9333.333333 10000
India 5000 5000.666667 5002
Japan 50000 50000.000000 50000
'''
# 以列表形式返回Age和Income的值
df_agg = df.groupby('Country').agg([list])[['Age','Income']]
print(df_agg)
'''
Age Income
list list
Country
America [40] [40000]
China [28, 23, 45] [10000, 10000, 8000]
India [25, 26, 23] [5000, 5002, 5000]
Japan [25] [50000]
'''
iterrows(): 将DataFrame迭代为(insex, Series)对。
iteritems(): 将DataFrame迭代为(列名, Series)对
itertuples(): 将DataFrame迭代为元祖。
import pandas as pd
inp = [{ 'c1':10,'c2':100},{ 'c1':11,'c2':120},{ 'c1':12,'c2':123}]
df = pd.DataFrame(inp)
print(df)
'''
c1 c2
0 10 100
1 11 120
2 12 123
'''
for index,row in df.iterrows():
print(row)
'''
c1 10
c2 100
Name: 0, dtype: int64
c1 11
c2 120
Name: 1, dtype: int64
c1 12
c2 123
Name: 2, dtype: int64
'''
for index,row in df.iteritems():
print(row)
'''
0 10
1 11
2 12
Name: c1, dtype: int64
0 100
1 120
2 123
Name: c2, dtype: int64
'''
for row in df.itertuples():
print(row)
'''
Pandas(Index=0, c1=10, c2=100)
Pandas(Index=1, c1=11, c2=120)
Pandas(Index=2, c1=12, c2=123)
'''
for row in df.itertuples():
print(getattr(row,'c1')," ",getattr(row,'c2'))
'''
10 100
11 120
12 123
'''