科学计算库Pandas(2):DataFrame对象的行、列与修改

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'])#loc()方法
print(df.iloc[0,0])#iloc()方法,同样为中括号[]
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']])
#注意loc[]里面的两个参数都用[]括起来了
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)#降序排num
print(dfSort)
print("****************")
dfSort = df.sort_values(by='num')#升叙排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
#自定义map函数(x是原有的行列值)
def test_map(x):
    return x+'_ABC'
print(df.rename(index=test_map,columns=test_map,inplace=False))
#默认为False,返回新的DataFrame
df#此时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
NAMEYEARNUM
AGuo256
BWAHAHAH268
CHuang2710
DYang399
print(df.rename(index=test_map,columns=test_map,inplace=True))
#inplace为True,表示在原df上需要改,返回值为None
df#df已经发生变化
None
NAME_ABCYEAR_ABCNUM_ABC
A_ABCGuo256
B_ABCWAHAHAH268
C_ABCHuang2710
D_ABCYang399
#字典为参数,修改某个索引,字典的键为现有索引,值为新的索引
df_change = df.rename(index={'A_ABC':'A_abc'},columns={'NAME_ABC':'NAME_abc'})
df_change
NAME_abcYEAR_ABCNUM_ABC
A_abcGuo256
B_ABCWAHAHAH268
C_ABCHuang2710
D_ABCYang399
#将某一列转化为索引
df_change.set_index('NAME_abc',drop=False)
#drop=False,保留下来这一列
NAME_abcYEAR_ABCNUM_ABC
NAME_abc
GuoGuo256
WAHAHAHWAHAHAH268
HuangHuang2710
YangYang399
#这时输出的索引也有name,可以去掉索引那一列的name,比较上下两个输出的区别
df_change2 = df_change.set_index('NAME_abc',drop=False)
df_change2.index.name=None
df_change2
NAME_abcYEAR_ABCNUM_ABC
GuoGuo256
WAHAHAHWAHAHAH268
HuangHuang2710
YangYang399
#某一行变成新的 列索引
df_change3=df.set_axis(df.iloc[0],axis=1,inplace=False)
df_change3.columns.name=None
df_change3
Guo256
A_ABCGuo256
B_ABCWAHAHAH268
C_ABCHuang2710
D_ABCYang399
df#与原df对比
NAME_ABCYEAR_ABCNUM_ABC
A_ABCGuo256
B_ABCWAHAHAH268
C_ABCHuang2710
D_ABCYang399

1.5 文末答案

原问题“那能获取多行多列吗?“

df[ ]不可以,df.loc[ ]及df.iloc[ ]可以!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值