pandas基础教程——Day1

本章内容

  1. Series对象
  2. DataFrame对象

一、Series

类似于一种一维数组,与ndarray的区别是,Series以ndarray为基础,能够为数据自定义标签,也就是索引(index),通过索引来访问数组。

import pandas as pd
from pandas import Series,DataFrame
import numpy as np
# 一维的数组
sel = Series([1,2,3,4])
print(sel)
'''
0    1
1    2
2    3
3    4
dtype: int64
'''

# 通常我们会自己创建索引
sel =  Series(data = [1,2,3,4],index=['a','b','c','d'])
sel =  Series(data = [1,2,3,4], index = list('abcd'))
print(sel.values)
'''
[1,2,3,4]
'''
print(sel.index)
'''
Index(['a', 'b', 'c', 'd'], dtype='object')
'''

# 获取索引和值对
print(list(sel.iteritems()))
print(sel)
'''
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

a    1
b    2
c    3
d    4
dtype: int64
'''

# 将字典转换为Series
dict={"red":100,"black":400,"green":300,"pink":900}
se3=Series(dict)
print(se3)
'''
red      100
black    400
green    300
pink     900
dtype: int64
'''

# Series对象同时支持位置和标签两种方式获取数据
print('索引下标',sel['c'])
print('位置下标',sel[2])
'''
索引下标 3
位置下标 3
'''

# 获取不连续的数据
print('索引下标',sel[['a','c']])
print('位置下标',sel[[1,3]])
'''
索引下标 a    1
c    3
dtype: int64
位置下标 b    2
d    4
dtype: int64
'''

# 可以使用切片或取数据
print('位置切片',sel[1:3])# 左包含右不包含
print('索引切片',sel['b':'d'])# 左右都包含
'''
位置切片 b    2
c    3
dtype: int64
索引切片 b    2
c    3
d    4
dtype: int64
'''

# 重新赋值索引的值
sel.index = list('dcba')
print(sel)
'''
d    1
c    2
b    3
a    4
dtype: int64
'''

# ReIndex重新索引,会返回一个新的Series(调用reindex将会重新排序,缺失值则用NaN填补)
result = sel.reindex(['b','a','c','d','e'])
print(result)
'''
b    3.0
a    4.0
c    2.0
d    1.0
e    NaN
dtype: float64
'''

# drop丢弃指定轴上的项
se1=pd.Series(range(10,15))
print(se1.drop([2,3]))
'''
0    10
1    11
4    14
dtype: int64
'''
Series的算术运算操作:
'''
Series的运算时基于index的,我们可以用加减乘除对两个series进行计算,pandas会根据index对相应数据进行计算,结果以浮点数形式存储,以免丢失精度。如果在两个Series中找不到相同的index,对应位置会返回一个空值NaN
'''
series1 = pd.Series([1,2,3,4],['London','HongKong','Humbai','lagos'])
series2 = pd.Series([1,3,6,4],['London','Accra','lagos','Delhi'])
print(series1)
print(series2)
print(series1-series2)
print(series1+series2)
print(series1*series2)
'''
London      1
HongKong    2
Humbai      3
lagos       4
dtype: int64
London    1
Accra     3
lagos     6
Delhi     4
dtype: int64
Accra       NaN
Delhi       NaN
HongKong    NaN
Humbai      NaN
London      0.0
lagos      -2.0
dtype: float64
Accra        NaN
Delhi        NaN
HongKong     NaN
Humbai       NaN
London       2.0
lagos       10.0
dtype: float64
Accra        NaN
Delhi        NaN
HongKong     NaN
Humbai       NaN
London       1.0
lagos       24.0
dtype: float64
'''

sel =  Series(data = [1,6,3,5], index = list('abcd'))
print(sel)
print(sel[sel>3]) # 布尔数组过滤
print(sel*2) # 标量乘法
print(np.square(sel)) # 可以直接加入到numpy的数学函数
'''
a    1
b    6
c    3
d    5
dtype: int64
b    6
d    5
dtype: int64
a     2
b    12
c     6
d    10
dtype: int64
a     1
b    36
c     9
d    25
dtype: int64
'''

二、DataFrame

Dataframe是一个二维的表结构。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自 己的标签。你可以把它想象成一个series的字典项。

1、创建DataFrame

使用二维数组ndarray

df1 = DataFrame(np.random.randint(0,10,(4,4)),index=[1,2,3,4],columns=['a','b','c','d'])
print(df1)
'''
   a  b  c  d
1  7  3  5  5
2  2  2  5  0
3  0  2  8  6
4  1  7  9  7
'''

使用字典:行索引由index决定,列索引由字典键决定。索引相同的情况下,相同索引的值会相对应,缺失值使用NaN

dict={
    'Province': ['Guangdong', 'Beijing', 'Qinghai', 'Fujian'],
    'pop': [1.3, 2.5, 1.1, 0.7],
    'year': [2018, 2018, 2018, 2018]}
df2=pd.DataFrame(dict,index=[1,2,3,4])
print(df2)
'''
    Province  pop  year
1  Guangdong  1.3  2018
2    Beijing  2.5  2018
3    Qinghai  1.1  2018
4     Fujian  0.7  2018
'''

# 使用from_dict
dict2={"a":[1,2,3],"b":[4,5,6]}
df6=pd.DataFrame.from_dict(dict2)
print(df6)
'''
   a  b
0  1  4
1  2  5
2  3  6
'''

data = {
    'Name':pd.Series(['zs','ls','we'],index=['a','b','c']),
    'Age':pd.Series(['10','20','30','40'],index=['a','b','c','d']),
    'country':pd.Series(['中国','日本','韩国'],index=['a','c','b'])
}
df = pd.DataFrame(data)
print(df)
dict1 = df.to_dict() # 将df转换为dict
print(dict1)
'''
  Name Age country
a   zs  10     中国
b   ls  20     韩国
c   we  30     日本
d  NaN  40     NaN

{'Name': {'a': 'zs', 'b': 'ls', 'c': 'we', 'd': nan}, 'Age': {'a': '10', 'b': '20', 'c': '30', 'd': '40'}, 'country': {'a': '中国', 'b': '韩国', 'c': '日本', 'd': nan}}
'''
2、DataFrame常用属性
# dataframe常用属性
df_dict = {
    'name':['James','Curry','Iversion'],
    'age':['18','20','19'],
    'national':['us','China','us']
}
df = pd.DataFrame(data=df_dict,index=['0','1','2'])
print(df)
# 获取行数和列数
print(df.shape)
# 获取行索引
print(df.index.tolist())
# 获取列索引
print(df.columns.tolist())
# 获取数据的类型
print(df.dtypes)
# 获取数据的维度
print(df.ndim)
# 获取数据的值
print(df.values)
# 获取数据的概览
print(df.info())
# 显示头几行,默认显示5行
print(df.head(2))
# 显示后几行
print(df.tail(1))
# 获取DataFrame的列
print(df['name'])
#因为我们只获取一列,所以返回的就是一个 Series
print(type(df['name']))
# 如果获取多个列,那返回的就是一个 DataFrame 类型:
print(df[['name','age']])
print(type(df[['name','age']]))
# 获取一行
print(df[0:1])
# 获取多行
print(df[1:3])
# 取多行里面的多列
print(df[1:3][['name','age']])

'''
df.loc 通过标签索引行数据
df.iloc 通过位置获取行数据
'''
# 获取某一行某一列的数据
print(df.loc['0','name'])
# 获取一行的所有列
print(df.loc['0',:])
# 获取某一行多列
print(df.loc['0',['name','age']])
# 获取不连续的多行多列
print(df.loc[['0','2'],['name','age']])
# 获取连续的多行多列
print(df.loc[['0':'2'],['name','age']])
# 取一行
print(df.iloc[1])
# 取连续多行
print(df.iloc[0:2])
# 取间断的多行
print(df.iloc[[0,2],:])
# 取某一列
print(df.iloc[:,1])
# 取某个值
print(df.iloc[0,1])
# 修改值
df.iloc[0,0] = 'panda'
# DataFrame中的排序
df = df.sort_values(by = 'age',ascending = False) # False为降序,默认为升序
3、修改行索引index、列索引columns
df1 = pd.DataFrame(np.arange(9).reshape(3, 3), index = ['bj', 'sh', 'gz'], columns=['a', 'b', 'c'])
df1.index = ['beijing', 'shanghai', 'guangzhou']
print(df1)
'''
           a  b  c
beijing    0  1  2
shanghai   3  4  5
guangzhou  6  7  8
'''

# 自定义map函数(x是原有的行列值)
def test_map(x):  
    return x+'_ABC'
print(df1.rename(index=test_map,columns=test_map))
'''
               a_ABC  b_ABC  c_ABC
beijing_ABC        0      1      2
shanghai_ABC       3      4      5
guangzhou_ABC      6      7      8
'''

# 用字典的键值对进行赋值
df = df1.rename(index={'bj':'beijing'},columns={'a':'aa'})
print(df)

# 列转化为索引
df1=pd.DataFrame({'X':range(5),'Y':range(5),'S':list("abcde"),'Z':[1,1,2,2,2]})
print(df1)
'''
   X  Y  S  Z
0  0  0  a  1
1  1  1  b  1
2  2  2  c  2
3  3  3  d  2
4  4  4  e  2
'''

# 指定一列为索引,drop=False表示在df中保留该列
result = df1.set_index('S',drop=False)
print(result)
'''
   X  Y  S  Z
S            
a  0  0  a  1
b  1  1  b  1
c  2  2  c  2
d  3  3  d  2
e  4  4  e  2
'''
4、添加数据

(1) 增加一行一列

# 增加数据
df1 = pd.DataFrame([['Snow','M',22],['Tyrion','M',32],['Sansa','F',18],['Arya','F',14]], columns=['name','gender','age'])
# 在数据框最后加上score一列
df1['score'] = [80,98,67,90]  # 增加列的元素个数要跟原数据列的个数一样
print(df1)
'''
     name gender  age  score
0    Snow      M   22     80
1  Tyrion      M   32     98
2   Sansa      F   18     67
3    Arya      F   14     90
'''

col_name=df1.columns.tolist()                   # 将数据框的列名全部提取出来存放在列表里
col_name.insert(2,'city')                      # 在列索引为2的位置插入一列,列名为:city,刚插入时不会有值,整列都是NaN
df1=df1.reindex(columns=col_name)              # DataFrame.reindex() 对原行/列索引重新构建索引值
print(df1)
df1['city']=['北京','山西','湖北','澳门']   # 给city列赋值
print(df1)
'''
     name gender city  age
0    Snow      M   北京   22
1  Tyrion      M   山西   32
2   Sansa      F   湖北   18
3    Arya      F   澳门   14
'''

# 创建一个DataFrame,用来增加进数据框的最后一行
new=pd.DataFrame({'name':'lisa',
                  'gender':'F',
                  'age':19
                  },index=[0])
print(new)
# print("-------在原数据框df1最后一行新增一行,用append方法------------")
df1=df1.append(new,ignore_index=True)   # ignore_index=False,表示不按原来的索引,从0开始自动递增
print(df1)

(2)增加多行多列

df1 = pd.DataFrame(np.arange(6).reshape(3,2),columns=['four','five'])
df2 = pd.DataFrame(np.arange(6).reshape(2,3),columns=['one','two','three'])

# 按行合并
result = pd.concat([df1,df2],axis=1)
print(result)
'''
   four  five  one  two  three
0     0     1  0.0  1.0    2.0
1     2     3  3.0  4.0    5.0
2     4     5  NaN  NaN    NaN
'''

# 按列合并
result = pd.concat([df1,df2],axis=0,ignore_index=True,sort=False)
print(result)
'''
four  five  one  two  three
0   0.0   1.0  NaN  NaN    NaN
1   2.0   3.0  NaN  NaN    NaN
2   4.0   5.0  NaN  NaN    NaN
3   NaN   NaN  0.0  1.0    2.0
4   NaN   NaN  3.0  4.0    5.0
'''
5、删除数据
df2 = pd.DataFrame(np.arange(9).reshape(3,3),columns=['one','two','three'])
df3 = df2.drop(['one'],axis=1,inplace=True)
print(df3)
'''
None,inplace = True时,无返回值,直接在df2上修改
'''
df3 = df2.drop(['one'],axis=1,inplace=False)
print(df3)
print(df2)
'''
   two  three
0    1      2
1    4      5
2    7      8
   one  two  three
0    0    1      2
1    3    4      5
2    6    7      8
'''
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345