DataFrame对象的行、列与修改
本文练习DataFrame的常用属性,注释中写出了笔者在练习过程中注意的很多细节,比如是否需要带括号,或者是否有两层括号等,希望能有所帮助。
本文中间埋了一个小问题,大家去发现吧,文末有答案!
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
fromdict= {
'name' : [ 'Guo' , 'Li' , 'Huang' , 'Yang' ] ,
'year' : [ 25 , 26 , 27 , 39 ] ,
'num' : [ 6 , 8 , 10 , 9 ] }
df= pd. DataFrame( fromdict, [ 'I' , 'II' , 'III' , 'IV' ] )
print ( df)
name year num
I Guo 25 6
II Li 26 8
III Huang 27 10
IV Yang 39 9
1.行与列
print ( '形状:行数与列数:' )
print ( df. shape)
print ( "****************" )
print ( '行索引:' )
print ( df. index. tolist( ) )
print ( "****************" )
print ( '列索引:' )
print ( df. columns. tolist( ) )
print ( "****************" )
print ( '列索引的数据类型:' )
print ( df. dtypes)
print ( "****************" )
print ( '数据维度:' )
print ( df. index. ndim)
print ( "****************" )
print ( 'values属性:以二维ndarray的形式返回DataFrame的数据' )
print ( df. values)
print ( "****************" )
print ( '数据表的信息:' )
print ( df. info( ) )
print ( "****************" )
形状:行数与列数:
(4, 3)
****************
行索引:
['I', 'II', 'III', 'IV']
****************
列索引:
['name', 'year', 'num']
****************
列索引的数据类型:
name object
year int64
num int64
dtype: object
****************
数据维度:
1
****************
values属性:以二维ndarray的形式返回DataFrame的数据
[['Guo' 25 6]
['Li' 26 8]
['Huang' 27 10]
['Yang' 39 9]]
****************
数据表的信息:
<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, I to IV
Data columns (total 3 columns):
name 4 non-null object
year 4 non-null int64
num 4 non-null int64
dtypes: int64(2), object(1)
memory usage: 128.0+ bytes
None
****************
print ( '获取某一列,返回一个Series对象:' )
print ( df[ 'year' ] )
print ( "****************" )
print ( '获取多列,返回DataFrame类型:' )
print ( df[ [ 'name' , 'num' ] ] )
print ( "****************" )
print ( '获取一行:' )
print ( df[ 0 : 1 ] )
print ( "****************" )
print ( df[ 1 : 2 ] )
print ( "****************" )
print ( '获取多行:' )
print ( df[ 2 : 4 ] )
print ( "****************" )
print ( '获取开始几行:' )
print ( df. head( 2 ) )
print ( "****************" )
print ( '获取多行中的某一列:' )
print ( df[ 2 : 4 ] [ [ 'name' , 'num' ] ] )
print ( "****************" )
print ( "那能获取多行多列吗,大家试一下,文末见答案~~~" )
获取某一列,返回一个Series对象:
I 25
II 26
III 27
IV 39
Name: year, dtype: int64
****************
获取多列,返回DataFrame类型:
name num
I Guo 6
II Li 8
III Huang 10
IV Yang 9
****************
获取一行:
name year num
I Guo 25 6
****************
name year num
II Li 26 8
****************
获取多行:
name year num
III Huang 27 10
IV Yang 39 9
****************
获取开始几行:
name year num
I Guo 25 6
II Li 26 8
****************
获取多行中的某一列:
name num
III Huang 10
IV Yang 9
****************
那能获取多行多列吗,大家试一下,文末见答案~~~
1.2 行与列升级版
用loc与iloc,组合行列获取数据
print ( '通过标签获取单个元素(即某一行某一列)loc与iloc:' )
print ( df. loc[ 'I' , 'name' ] )
print ( df. iloc[ 0 , 0 ] )
print ( "****************" )
print ( '通过标签获取某一行多列数据loc:' )
print ( df. loc[ 'I' , [ 'name' , 'year' ] ] )
print ( "****************" )
print ( '某一行所有列loc:' )
print ( df. loc[ 'I' , : ] )
print ( "****************" )
print ( '某一行所有列iloc:' )
print ( df. iloc[ 0 ] )
print ( "****************" )
print ( "选择多行多列loc:" )
print ( df. loc[ [ 'I' , 'II' ] , [ 'name' , 'year' ] ] )
print ( "****************" )
print ( '间隔的行与列也可取到loc:' )
print ( df. loc[ [ 'I' , 'IV' ] , [ 'name' , 'num' ] ] )
print ( "****************" )
print ( '间隔的行与列也可取到iloc:' )
print ( df. iloc[ [ 0 , 2 ] , [ 0 , 2 ] ] )
print ( "****************" )
print ( '连续的行与列也可取到loc:' )
print ( df. loc[ 'II' : 'IV' , 'name' : 'num' ] )
print ( "****************" )
print ( "连续选择多行iloc:" )
print ( df. iloc[ 0 : 3 ] )
print ( "****************" )
print ( "获取某一列:" )
print ( df. iloc[ : , 2 ] )
通过标签获取单个元素(即某一行某一列)loc与iloc:
Guo
Guo
****************
通过标签获取某一行多列数据loc:
name Guo
year 25
Name: I, dtype: object
****************
某一行所有列loc:
name Guo
year 25
num 6
Name: I, dtype: object
****************
某一行所有列iloc:
name Guo
year 25
num 6
Name: I, dtype: object
****************
选择多行多列loc:
name year
I Guo 25
II Li 26
****************
间隔的行与列也可取到loc:
name num
I Guo 6
IV Yang 9
****************
间隔的行与列也可取到iloc:
name num
I Guo 6
III Huang 10
****************
连续的行与列也可取到loc:
name year num
II Li 26 8
III Huang 27 10
IV Yang 39 9
****************
连续选择多行iloc:
name year num
I Guo 25 6
II Li 26 8
III Huang 27 10
****************
获取某一列:
I 6
II 8
III 10
IV 9
Name: num, dtype: int64
1.3 排序与数据修改
排序
dfSort = df. sort_values( by= 'num' , ascending= False )
print ( dfSort)
print ( "****************" )
dfSort = df. sort_values( by= 'num' )
print ( dfSort)
name year num
III Huang 27 10
IV Yang 39 9
II Li 26 8
I Guo 25 6
****************
name year num
I Guo 25 6
II Li 26 8
IV Yang 39 9
III Huang 27 10
修改数据
df. iloc[ 1 , 0 ] = 'WAHAHAH'
print ( df)
print ( "****************" )
name year num
I Guo 25 6
II WAHAHAH 26 8
III Huang 27 10
IV Yang 39 9
****************
1.4 修改index,columns
print ( '修改前:' , df. index)
df. index= [ 'A' , 'B' , "C" , 'D' ]
print ( '修改后:' , df. index)
print ( "****************" )
print ( '修改前:' , df. columns)
df. columns= [ 'NAME' , 'YEAR' , "NUM" ]
print ( '修改后:' , df. columns)
修改前: Index(['I', 'II', 'III', 'IV'], dtype='object')
修改后: Index(['A', 'B', 'C', 'D'], dtype='object')
****************
修改前: Index(['name', 'year', 'num'], dtype='object')
修改后: Index(['NAME', 'YEAR', 'NUM'], dtype='object')
print ( df)
NAME YEAR NUM
A Guo 25 6
B WAHAHAH 26 8
C Huang 27 10
D Yang 39 9
def test_map ( x) :
return x+ '_ABC'
print ( df. rename( index= test_map, columns= test_map, inplace= False ) )
df
NAME_ABC YEAR_ABC NUM_ABC
A_ABC Guo 25 6
B_ABC WAHAHAH 26 8
C_ABC Huang 27 10
D_ABC Yang 39 9
NAME YEAR NUM A Guo 25 6 B WAHAHAH 26 8 C Huang 27 10 D Yang 39 9
print ( df. rename( index= test_map, columns= test_map, inplace= True ) )
df
None
NAME_ABC YEAR_ABC NUM_ABC A_ABC Guo 25 6 B_ABC WAHAHAH 26 8 C_ABC Huang 27 10 D_ABC Yang 39 9
df_change = df. rename( index= { 'A_ABC' : 'A_abc' } , columns= { 'NAME_ABC' : 'NAME_abc' } )
df_change
NAME_abc YEAR_ABC NUM_ABC A_abc Guo 25 6 B_ABC WAHAHAH 26 8 C_ABC Huang 27 10 D_ABC Yang 39 9
df_change. set_index( 'NAME_abc' , drop= False )
NAME_abc YEAR_ABC NUM_ABC NAME_abc Guo Guo 25 6 WAHAHAH WAHAHAH 26 8 Huang Huang 27 10 Yang Yang 39 9
df_change2 = df_change. set_index( 'NAME_abc' , drop= False )
df_change2. index. name= None
df_change2
NAME_abc YEAR_ABC NUM_ABC Guo Guo 25 6 WAHAHAH WAHAHAH 26 8 Huang Huang 27 10 Yang Yang 39 9
df_change3= df. set_axis( df. iloc[ 0 ] , axis= 1 , inplace= False )
df_change3. columns. name= None
df_change3
Guo 25 6 A_ABC Guo 25 6 B_ABC WAHAHAH 26 8 C_ABC Huang 27 10 D_ABC Yang 39 9
df
NAME_ABC YEAR_ABC NUM_ABC A_ABC Guo 25 6 B_ABC WAHAHAH 26 8 C_ABC Huang 27 10 D_ABC Yang 39 9
1.5 文末答案
原问题“那能获取多行多列吗?“
df[ ]不可以,df.loc[ ]及df.iloc[ ]可以!!