Pandas 02- DataFrame

1.DataFrame结构

DataFrame的每一列数据都可以看成一个Series结构,只不过,DataFrame为每列数据值增加了一个列标签。因此DataFrame其实是从Series的基础上演变而来,并且他们有相同的标签,在数据分析任务中DataFrame的应用非常广泛,因为它描述数据的更为清晰、直观。
以一个学生表为例:
Pandas 02- DataFrame_第1张图片
下面对 DataFrame数据结构的特点做简单地总结,

  1. DataFrame每一列的标签值允许使用不同的数据类型;
  2. DataFrame是表格型的数据结构,具有行和列;
  3. DataFrame 中的每个数据值都可以被修改。
  4. DataFrame结构的行数、列数允许增加或者删除;
  5. DataFrame有两个方向的标签轴,分别是行标签和列标签;
  6. 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)

列表嵌套字典创建DataFrame对象,其中字典的键为列标签,没有的值会默认为NaN

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
'''

Series创建DataFrame(每个Series为1列元素,列名为该Series名称)

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
'''

2.列操作DataFrame

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
'''

pop()弹出列、del删除列都可以改变原DataFrame

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]
'''

3.行操作DataFrame

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   刘杰
'''

4.其他操作

转置

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
'''

rename()修改行列标签名称,info() 显示信息

# 修改行标签
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
'''

标签排序sort_index()、值排序sort_values()

作用:默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
注意: df.sort_index()可以完成和df.sort_values()完全相同的功能,
但python更推荐用只用df.sort_index()对“根据行标签"和"根据列标签"排序,其他排序方式用df.sort_values()。

  1. axis: 0按照行名排序;1按照列名排序
  2. ascending:默认True升序排列;False降序排列
  3. inplace:默认False,否则排序之后的数据直接替换原来的数据
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
'''

5.分组groupBy、聚合agg

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]
'''

6.iterrows()、iteritems()、itertuples()

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
'''

你可能感兴趣的:(Python,pandas,python,数据分析)