Pandas 数据结构

学习目标

  • 掌握Series的常用属性及方法

  • 掌握DataFrame的常用属性及方法

  • 掌握更改Series和DataFrame的方法

  • 掌握如何导入导出数据

创建Series和DataFrame

  • DataFrame和Series是Pandas最基本的两种数据结构

  • DataFrame和Series的区别联系:在Pandas中,Series是一维容器,Series表示DataFrame的每一列:

    • 可以把DataFrame看作由Series对象组成的字典,其中key是列名,值是Series

    • Series和Python中的列表非常相似,但是它的每个元素的数据类型必须相同

创建Series

  • 创建 Series 的最简单方法是传入一个Python列表

    • 如果传入的数据类型是统一的数字,那么最终的dtype类型是int64

    • 如果传入的数据类型是统一的字符串,那么最终的dtype类型是object

    • 如果传入的数据类型是多种类型,那么最终的dtype类型也是object

    import pandas as pd
    s = pd.Series(['banana', 42])
    print(s)
    s = pd.Series(['banana', 'apple'])
    print(s)
    s = pd.Series([50, 42])
    print(s)
    # 输出结果如下
    0    banana
    1        42
    dtype: object
    0    banana
    1     apple
    dtype: object
    0    50
    1    42
    dtype: int64
    # 上面的结果中,左边显示的0,1是Series的索引,默认为0,1,2,3...
  • 创建Series时,也可以通过index参数 来指定行索引

    s = pd.Series(['Wes McKinney','Male'],index = ['Name','Gender'])
    print(s)
    # 输出结果如下
    Name      Wes McKinney
    Gender            Male
    dtype: object

创建 DataFrame

  • 可以使用字典来创建DataFrame

    name_df = pd.DataFrame({'Name':['Tome','Bob'],'Occupation':['Teacher','IT Engineer'],'age':[28,36]})
    print(name_df)
    # 输出结果如下Name   Occupation  age
    0  Tome      Teacher   28
    1   Bob  IT Engineer   36
  • 创建DataFrame的时候可以使用colums参数指定列的顺序,也可以使用index来指定行索引

    name_df = pd.DataFrame(data={'Occupation': ['Teacher', 'IT Engineer'],'Age': [28,36]},columns=['Age', 'Occupation'],index=['Tome', 'Bob']
    )
    print(name_df)
    # 输出结果如下Age   Occupation
    Tome   28      Teacher
    Bob    36  IT Engineer

Series 常用操作

Series常用属性

  • 使用 DataFrame的loc 属性获取数据集里的一行,就会得到一个Series对象

    data = pd.read_csv('data/nobel_prizes.csv',index_col='id')
    data.head()
    # 输出结果如下图
  • 使用行索引标签选择一条记录

    one_row = data.loc[941]
    print(type(one_row))
    print(one_row)
    # 输出结果如下
    <class 'pandas.core.series.Series'>
    year                                                              2017
    category                                                       physics
    overallMotivation                                                  NaN
    firstname                                                       Rainer
    surname                                                          Weiss
    motivation           "for decisive contributions to the LIGO detect...
    share                                                                2
    Name: 941, dtype: object
  • 可以通过 index 和 values属性获取行索引和值

    print(one_row.index)
    print(one_row.values)
    # 输出结果如下
    Index(['year', 'category', 'overallMotivation', 'firstname', 'surname','motivation', 'share'],dtype='object')
    [2017 'physics' nan 'Rainer' 'Weiss''"for decisive contributions to the LIGO detector and the observation of gravitational waves"'2]
  • Series的keys方法,作用与index属性一样

    data.keys()
    # 输出结果如下
    Index(['year', 'category', 'overallMotivation', 'firstname', 'surname','motivation', 'share'],dtype='object')
  • Series的其他属性

    属性 说明
    loc 使用索引值取子集
    iloc 使用索引位置取子集
    dtype或dtypes Series内容的类型
    T Series的转置矩阵
    shape 数据的维数
    size Series中元素的数量
    values Series的值

    例如

    print(data.loc[941])
    print(data.iloc[0])
    print(data.shape, data.size)
    # 输出结果如下
    year                                                              2017
    category                                                       physics
    overallMotivation                                                  NaN
    firstname                                                       Rainer
    surname                                                          Weiss
    motivation           "for decisive contributions to the LIGO detect...
    share                                                                2
    Name: 941, dtype: object
    year                                                              2017
    category                                                       physics
    overallMotivation                                                  NaN
    firstname                                                       Rainer
    surname                                                          Weiss
    motivation           "for decisive contributions to the LIGO detect...
    share                                                                2
    Name: 941, dtype: object
    (923, 7) 6461
    

Series常用方法

常见计算

针对数值型的Series,可以进行常见计算

  • 平均值

#print(data.head())
share = data.share  # 从DataFrame中 获取Share列(几人获奖)返回Series
#print(share)
print(share.mean())    #计算几人获奖的平均值
# 输出结果如下
1.982665222101842
  • 最大值

share.max() # 计算最大值
# 输出结果如下
4
  • 最小值

share.min() # 计算最小值
# 输出结果如下
1
  • 标准差

share.std() # 计算标准差
# 输出结果如下
0.9324952202244597

2.2.2 value_counts函数

在获取某一列数据的Series对象后,通过value_counts()方法,可以返回以该列的值为分类依据,不同值的条目总数量;现在我们要对data/movie.csv数据集进行统计,分别统计相同点赞数的主演数量;实现如下:

  • 主演的facebook点赞数

movie = pd.read_csv('data/movie.csv')    # 加载电影数据
actor_1_fb_likes = movie['actor_1_facebook_likes'] # 从电影数据中取出主演的facebook点赞数
actor_1_fb_likes.head() #查看主演的facebook点赞数
# 输出结果如下
0     1000.0
1    40000.0
2    11000.0
3    27000.0
4      131.0
Name: actor_1_facebook_likes, dtype: float64
  • 分别统计相同点赞数的主演数量(有多少个主演的点赞数相同,且点赞数是多少)

actor_1_fb_likes.value_counts()
# 输出结果如下【左列为点赞数,右列为主演数量】
1000.0     436
11000.0    206
2000.0     189
3000.0     150...
216.0        1
859.0        1
225.0        1
334.0        1
Name: actor_1_facebook_likes, Length: 877, dtype: int64

再来看一个例子,现用vlaue_count函数统计不同导演指导的电影数量

  • 获取导演名字director_name列的Series对象

# movie = pd.read_csv('data/movie.csv')    # 加载电影数据
director = movie['director_name']   # 从电影数据中获取导演名字 返回Series
director.head()  #查看导演Series数据
# 输出结果如下
0        James Cameron
1       Gore Verbinski
2           Sam Mendes
3    Christopher Nolan
4          Doug Walker
Name: director_name, dtype: object
  • 统计不同导演指导的电影数量,本质就是以director_name列的值做分类,分别统计不同数据的数量

director.value_counts()      # 统计不同导演指导的电影数量
# 输出结果如下
Steven Spielberg    26
Woody Allen         22
Clint Eastwood      20
Martin Scorsese     20..
Gavin Wiesen         1
Andrew Morahan       1
Luca Guadagnino      1
Richard Montoya      1
Name: director_name, Length: 2397, dtype: int64

count函数

count函数可以统计Series对象中的非空值的总数(指定列中的数据没有空值,则计数+1)

  • 统计有导演的电影数量

director.count()
# 输出结果如下
4814
  • 注意Series对象的count函数和value_counts函数的区别

    • Series对象的count函数:统计Series对象中的非空值的总数

    • Series对象的value_counts函数:统计以Series对象的值为分类依据,不同值的条目总数量

describe函数

Series对象的describe函数可以输出统计描述

  • 查看facebook上对主演点赞数这一列数据的统计描述

actor_1_fb_likes.describe()
# 输出结果如下
count      4909.000000
mean       6494.488491
std       15106.986884
min           0.000000
25%         607.000000
50%         982.000000
75%       11000.000000
max      640000.000000
Name: actor_1_facebook_likes, dtype: float64
  • 查看导演名字这一列数据的统计描述

director.describe()
# 输出结果如下
count                 4814
unique                2397
top       Steven Spielberg
freq                    26
Name: director_name, dtype: object
  • 结果描述如下图所示

Series的其他方法列表

方法 说明
append 连接两个或多个Series
corr 计算与另一个Series的相关系数
cov 计算与另一个Series的协方差
describe 计算常见统计量
drop_duplicates 返回去重之后的Series
equals 判断两个Series是否相同
get_values 获取Series的值,作用与values属性相同
hist 绘制直方图
isin Series中是否包含某些值
min 返回最小值
max 返回最大值
mean 返回算术平均值
median 返回中位数
mode 返回众数
quantile 返回指定位置的分位数
replace 用指定值代替Series中的值
sample 返回Series的随机采样值
sort_values 对值进行排序
to_frame 把Series转换为DataFrame
unique 去重返回数组

布尔值列表获取Series对象中部分数据

scientists.csv数据集中,列出大于Age列的平均值的具体值,具体步骤如下:

  • 加载并观察数据集

scientists = pd.read_csv('data/scientists.csv')
print(scientists)
#print(scientists.head())
# 输出结果如下Name        Born        Died  Age          Occupation
0     Rosaline Franklin  1920-07-25  1958-04-16   37             Chemist
1        William Gosset  1876-06-13  1937-10-16   61        Statistician
2  Florence Nightingale  1820-05-12  1910-08-13   90               Nurse
3           Marie Curie  1867-11-07  1934-07-04   66             Chemist
4         Rachel Carson  1907-05-27  1964-04-14   56           Biologist
5             John Snow  1813-03-15  1858-06-16   45           Physician
6           Alan Turing  1912-06-23  1954-06-07   41  Computer Scientist
7          Johann Gauss  1777-04-30  1855-02-23   77       Mathematicia
  • 计算Age的平均值

ages = scientists['Age']
ages.mean()
# 输出结果如下
59.125
  • 输出大于Age列的平均值的具体值

print(ages[ages>ages.mean()])
# 输出结果如下
1    61
2    90
3    66
7    77
Name: Age, dtype: int64

在本例中,ages>ages.mean(),到底是什么?

为什么ages[ages>ages.mean()]就能返回我们想要的结果?

  • 利用表达式 ages > ages.mean() ,获取布尔值构成的series对象

new_ages_s = ages>ages.mean()
print(new_ages_s)
print(new_ages_s.values)
print(list(new_ages_s.values))
# 输出结果如下
0    False
1     True
2     True
3     True
4    False
5    False
6    False
7     True
Name: Age, dtype: bool
[False  True  True  True False False False  True]
[False, True, True, True, False, False, False, True]
  • 从Series中获取部分数据,可以通过标签,索引,也可以传入布尔值的列表

bool_values = (list(new_ages_s.values)) # 构造布尔值列表
ages[bool_values] # 通过布尔索引来控制,输出指定范围
# 输出结果如下
1    61
2    90
3    66
7    77
Name: Age, dtype: int64

Series 的运算

Series和数值型变量计算

Series和数值型变量计算时,变量会与Series中的每个元素逐一进行计算

  • 加法

ages+100
# 输出结果如下
0    137
1    161
2    190
3    166
4    156
5    145
6    141
7    177
Name: Age, dtype: int64
  • 乘法

ages*2
# 输出结果如下
0     74
1    122
2    180
3    132
4    112
5     90
6     82
7    154
Name: Age, dtype: int64

2.4.2 两个Series之间计算

  • 两个Series之间计算,如果Series元素个数相同,则将两个Series对应元素进行计算

print(ages+ages)
print('='*10)
print(ages*ages)
# 输出结果如下
0     74
1    122
2    180
3    132
4    112
5     90
6     82
7    154
Name: Age, dtype: int64
==========
0    1369
1    3721
2    8100
3    4356
4    3136
5    2025
6    1681
7    5929
Name: Age, dtype: int64
  • 元素个数不同的Series之间进行计算,会根据索引进行。索引不同的元素最终计算的结果会填充成缺失值,用NaN表示

print(ages)
print('='*10)
print(pd.Series([1,100]))
print('='*10)
print(ages + pd.Series([1,100]))
# 输出结果如下
0    37
1    61
2    90
3    66
4    56
5    45
6    41
7    77
Name: Age, dtype: int64
==========
0      1
1    100
dtype: int64
==========
0     38.0
1    161.0
2      NaN
3      NaN
4      NaN
5      NaN
6      NaN
7      NaN
dtype: float64:
  • 练习1:元素个数不同的Series之间的乘法计算

print(ages * pd.Series([1,100]))
# 合并多个Series为一个DataFrame
new_df = pd.concat([ages, pd.Series([1,100]), ages * pd.Series([1,100])], axis=1)
new_df
# 输出结果如下
0      37.0
1    6100.0
2       NaN
3       NaN
4       NaN
5       NaN
6       NaN
7       NaN
dtype: float64
Age 0   1
0   37  1.0 37.0
1   61  100.0   6100.0
2   90  NaN NaN
3   66  NaN NaN
4   56  NaN NaN
5   45  NaN NaN
6   41  NaN NaN
7   77  NaN NaN
  • 练习2:Series对象ages和倒序的ages做相乘计算

# sort_index() 对索引进行排序
rev_ages = ages.sort_index(ascending=False)
# 合并多个Series为一个DataFrame
pd.concat([ages, rev_ages, ages*ages, ages*rev_ages], axis=1)
# 输出结果如下Age Age Age Age
0   37  37  1369    1369
1   61  61  3721    3721
2   90  90  8100    8100
3   66  66  4356    4356
4   56  56  3136    3136
5   45  45  2025    2025
6   41  41  1681    1681
7   77  77  5929    5929
  • 练习3:构造两个默认索引、且索引数量相同的Series,二者做相乘计算

# 构造两个默认索引、且数量相同的Series
print(pd.Series([1,2]))
print(pd.Series([3,4]))
# 计算相乘
print(pd.Series([1,2])* pd.Series([3,4]))
# 输出结果如下
0    1
1    2
dtype: int64
0    3
1    4
dtype: int64
0    3
1    8
dtype: int64
  • 练习4:索引值不同的两个Series相乘

print(pd.Series([2,1])* pd.Series([3,4]))
print(pd.Series([2,1],index = [2,3])* pd.Series([3,4]))
# 输出结果如下
0    6
1    4
dtype: int64
0   NaN
1   NaN
2   NaN
3   NaN
dtype: float64
  • 练习5:索引值部分相同的两个Series相乘

print(pd.Series([2,1],index = [2,3]))
print(pd.Series([3,4],index = [1,2]))
print(pd.Series([3,4],index = [1,2])*pd.Series([2,1],index = [2,3]))
# 输出结果如下
2    2
3    1
dtype: int64
1    3
2    4
dtype: int64
1    NaN
2    8.0
3    NaN
dtype: float64
  • 通过上述练习,得出Series之间计算的结论

    • Series之间进行计算时,数据会尽可能依据索引标签的值进行相互计算

    • 索引值相同的,对应计算得出新的Series

    • 索引值不同的元素最终计算的结果会填充成缺失值,用NaN表示

DataFrame常用操作

DataFrame的常用属性和方法

DataFrame是Pandas中最常见的对象,Series数据结构的许多属性和方法在DataFrame中也一样适用

  • df.shape 行数和列数

movie = pd.read_csv('data/movie.csv')
# 打印行数和列数
print(movie.shape)
# 输出结果
(4916, 28)
  • df.size 数据的个数(列数*行数,NaN值也算)

# 打印数据的个数
movie.size
# 输出结果
137648
  • df.ndim 数据的维度

# 该数据集的维度
movie.ndim
# 输出结果
2
  • 数据的长度(行数)

# 该数据集的长度
len(movie)
# 输出结果
4916
  • 各个列的非空值的个数

# 各个列的值的个数
movie.count()
# 输出结果
color                     4897
director_name             4814
num_critic_for_reviews    4867
duration                  4901...
actor_2_facebook_likes    4903
imdb_score                4916
aspect_ratio              4590
movie_facebook_likes      4916
Length: 28, dtype: int64
  • 各个列的最小值

# 各列的最小值
movie.min()
# 输出结果
num_critic_for_reviews        1
duration                      7
director_facebook_likes       0
actor_3_facebook_likes        0...
actor_2_facebook_likes        0
imdb_score                  1.6
aspect_ratio               1.18
movie_facebook_likes          0
Length: 19, dtype: object
  • 对整个df的统计描述,和series的统计描述返回相同

movie.describe()

DataFrame的布尔索引

  • 同Series一样,DataFrame也可以使用布尔索引获取数据子集。

# 使用布尔索引获取duration列的值大于平均值的数据
print(movie['duration'] > movie['duration'].mean())
movie[movie['duration'] > movie['duration'].mean()]
# 输出结果如下
  • 本质就是传入布尔值构成的列表,来获取部分数据,True所对应的数据会被保留

# 获取前5行数据中的第1、2、4个
movie.head()[[True,True,False,True,False]]
# 输出结果如下
color director_name num_critic_for_reviews duration director_facebook_likes actor_3_facebook_likes actor_2_name actor_1_facebook_likes gross genres ... num_user_for_reviews language country content_rating budget title_year actor_2_facebook_likes imdb_score aspect_ratio movie_facebook_likes
0 Color James Cameron 723.0 178.0 0.0 855.0 Joel David Moore 1000.0 760505847.0 Action|Adventure|Fantasy|Sci-Fi ... 3054.0 English USA PG-13 237000000.0 2009.0 936.0 7.9 1.78 33000
1 Color Gore Verbinski 302.0 169.0 563.0 1000.0 Orlando Bloom 40000.0 309404152.0 Action|Adventure|Fantasy ... 1238.0 English USA PG-13 300000000.0 2007.0 5000.0 7.1 2.35 0
3 Color Christopher Nolan 813.0 164.0 22000.0 23000.0 Christian Bale 27000.0 448130642.0 Action|Thriller ... 2701.0 English USA PG-13 250000000.0 2012.0 23000.0 8.5 2.35 164000

3 rows × 28 columns

DataFrame的运算

DataFrame和数值进行运算

当DataFrame和数值进行运算时,DataFrame中的每一个元素会分别和数值进行运算

  • 加载数据集并观察

scientists = pd.read_csv('data/scientists.csv')
scientists.head()Name   Born    Died    Age Occupation
0   Rosaline Franklin   1920-07-25  1958-04-16  37  Chemist
1   William Gosset  1876-06-13  1937-10-16  61  Statistician
2   Florence Nightingale    1820-05-12  1910-08-13  90  Nurse
3   Marie Curie 1867-11-07  1934-07-04  66  Chemist
4   Rachel Carson   1907-05-27  1964-04-14  56  Biologist
  • df和数值进行运算

scientists*2
  • 两个DataFrame之间进行计算,和series一样会根据索引的值进行对应计算

scientists+scientists
# 输出结果和 scientists*2 相同
  • 当两个DataFrame索引值不能对应时,不匹配的会返回NaN

print(scientists)
print('='*10)
print(scientists[:4])
print('='*10)
scientists+scientists[:4]

DataFrame其他操作

给行索引操作

加载数据文件后指定某列为索引

加载数据文件时,如果不指定行索引,Pandas会自动加上从0开始的索引;可以通过df.set_index('列名')的方法重新对指定的列设置为索引

  • 查看数据集,注意数据的列数

movie = pd.read_csv('data/movie.csv')
movie
# 输出结果如下图
  • 指定某列为索引,并观察列数

movie2 = movie.set_index('movie_title')
movie2
  • 此时可以使用df.reset_index()重置索引,恢复为原来的df对象

加载数据文件时指定某列为行索引

加载数据文件的时候,可以通过通过index_col参数,指定使用某一列数据作为行索引;并通过reset_index()方法可以重置索引

pd.read_csv('data/movie.csv', index_col='movie_title')

DataFrame修改行名和列名

df.rename()函数修改行列名

DataFrame创建之后,可以通过rename()方法对原有的行索引名和列名进行修改

  • 单独运行:加载数据,并指定列作为索引

pd.read_csv('data/movie.csv', index_col='movie_title')
  • 单独运行:查看索引列前5个值

movie = pd.read_csv('data/movie.csv', index_col='movie_title')
movie.index[:5]
  • 单独运行:查看前5个列名

movie.columns[:5]
  • 单独运行:替换索引值和列名

# 构造要修改的索引值对应字典
idx_rename = {'Avatar':'Ratava', 'Spectre': 'Ertceps'}
# 构造要修改的列名对应字典
col_rename = {'director_name':'Director Name', 'num_critic_for_reviews': 'Critical Reviews'}
# 替换并显示前5行数据
movie.rename(index=idx_rename, columns=col_rename).head()
  • 整个执行过程如下图所示

对df的行列名重新赋值

如果不使用dfrename(),也可以将df.indexdf.columns属性提取出来,修改之后,再赋值回去

  • 单独运行:加载数据,并指定列作为索引,查看前3行数据

movie = pd.read_csv('data/movie.csv', index_col='movie_title')
movie.head(3)
  • 单独运行:分别查看数据的前5个索引值,和前5个列名

index_list = movie.index.tolist()
column_list = movie.columns.tolist()
print(index_list[:5],'\n',column_list[:5])
  • 单独运行:修改列表中的具体的值

index_list[0] = 'Ratava'
index_list[2] = 'Ertceps'
column_list[1] = 'Director Name'
column_list[2] = 'Critical Reviews'
print(index_list[:5], '\n', column_list[:5])
  • 单独运行:将修改值的列表分别赋值给df数据对象的index属性和columns属性

movie.index = index_list
movie.columns = column_list
movie.head(3)

添加删除插入列

添加列

通过dataframe['列名']添加新列,添加至最后

  • 添加列名为 has_seen 的一列,值都为0

movie = pd.read_csv('data/movie.csv')
movie['has_seen'] = 0
movie
# 输出结果如下图
  • 添加一个新列,列名为actor_director_facebook_likes,统计导演和123号主演的点赞数的总和

movie['actor_director_facebook_likes'] = (movie['actor_1_facebook_likes'] + movie['actor_2_facebook_likes'] + movie['actor_3_facebook_likes'] + movie['director_facebook_likes']
)
movie.head()
# 输出结果如下图,注意:NaN与数值进行运算的结果都是NaN

删除列

  • 调用df.drop('列名', axis='columns')方法删除列,参数axis='columns'表示对列进行删除操作

new_movie = movie.drop('actor_director_facebook_likes', axis='columns')
new_movie.head(5)
  • 注意:错误演示,此时运行的结果还是会出现指定删除的列;原因是df.drop()返回的是一个新的df对象,新df中没有指定删除的列,但原来的旧df中还是存在该列的

movie.drop('actor_director_facebook_likes', axis='columns')
movie.head(5)

插入列

使用df.insert(loc=列下标数字, column='列名', value=该列所有的值)方法插入列

  • 计算在点赞数上,主演1的比主演2多多少;将计算的值作为列插入到原来第一列的前边;显示5行5列数据

movie = pd.read_csv('data/movie.csv')
movie.insert(loc=0,column='actor1_likes-actor2_likes',value=movie['actor_1_facebook_likes'] - movie['actor_2_facebook_likes'])
movie.iloc[list(range(5)), list(range(5))]
# 输出结果如下
actor1_likes-actor2_likes   color   director_name   num_critic_for_reviews  duration
0   64.0    Color   James Cameron   723.0   178.0
1   35000.0 Color   Gore Verbinski  302.0   169.0
2   10607.0 Color   Sam Mendes  602.0   148.0
3   4000.0  Color   Christopher Nolan   813.0   164.0
4   119.0   NaN Doug Walker NaN NaN

导出和导入数据

Pickle文件

5.1.1 保存为pickle文件

  • 调用to_pickle方法将以二进制格式保存数据

  • 如要保存的对象是计算的中间结果,或者保存的对象以后会在Python中复用,可把对象保存为.pickle文件

  • 如果保存成pickle文件,只能在python中使用

  • 文件的扩展名可以是.p,.pkl,.pickle

scientists = pd.read_csv('data/scientists.csv')
names = scientists['Name']
names.to_pickle('scientists_name.pickle')
scientists.to_pickle('scientists_df.pickle')

读取pickle文件

可以使用pd.read_pickle函数读取.pickle文件中的数据

scientists_name = pd.read_pickle('scientists_name.pickle')
print(scientists_name)
# 输出结果如下
0       Rosaline Franklin
1          William Gosset
2    Florence Nightingale
3             Marie Curie
4           Rachel Carson
5               John Snow
6             Alan Turing
7            Johann Gauss
Name: Name, dtype: object

CSV文件

我们用pd.read_csv()函数读取csv文件,使用df.to_csv()将数据保存为csv文件

  • 在CSV文件中,对于每一行,各列采用逗号分隔;使用\n换行符换行

  • 除了逗号,还可以使用其他类型的分隔符,比如TSV文件,使用制表符作为分隔符

  • CSV是数据协作和共享的首选格式,因为可以使用excel打开

# 默认使用逗号作为分隔符
names.to_csv('scientists_name.csv')
# TSV文件,设置分隔符必须为\t
scientists.to_csv('scientists_df.tsv', sep='\t')
#不在csv文件中写行名
scientists.to_csv('scientists_df_noindex.csv', index=False)

Excel文件

注意:根据anaconda的版本不同,pandas读写excel有时需要额外安装xlwtxlrdopenpyxl三个包

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlwt
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd

保存成Excel文件

  • Series这种数据结构不支持to_excel方法,想保存成Excel文件,需要把Series转换成DataFrame

names_df = names.to_frame()
import xlwt
names_df.to_excel('scientists_name_df.xls')
names_df.to_excel('scientists_name_df.xlsx')
# xls 是一个特有的二进制格式,其核心结构是复合文档类型的结构,而 xlsx 的核心结构是 XML 类型的结构,采用的是基于 XML 的压缩方式,使其占用的空间更小;xlsx的最后一个x表是xml
# xls是excel2003及以前版本生成的文件格式,而xlsx是excel2007及以后版本生成的文件格式。
  • DataFrame直接保存为Excel格式

scientists.to_excel('scientists_df.xlsx', sheet_name='scientists', index=False)

5.3.2 读取Excel文件

使用pd.read_excel() 读取Excel文件

pd.read_excel('scientists_df.xlsx')
# 输出结果如下Name    Born    Died    Age Occupation
0   Rosaline Franklin   1920-07-25  1958-04-16  37  Chemist
1   William Gosset  1876-06-13  1937-10-16  61  Statistician
2   Florence Nightingale    1820-05-12  1910-08-13  90  Nurse
3   Marie Curie 1867-11-07  1934-07-04  66  Chemist
4   Rachel Carson   1907-05-27  1964-04-14  56  Biologist
5   John Snow   1813-03-15  1858-06-16  45  Physician
6   Alan Turing 1912-06-23  1954-06-07  41  Computer Scientist
7   Johann Gauss    1777-04-30  1855-02-23  77  Mathematician

【了解】feather格式文件

  • feather是一种文件格式,用于存储二进制对象

  • feather对象也可以加载到R语言中使用

  • feather格式的主要优点是在Python和R语言之间的读写速度要比CSV文件快

  • feather数据格式通常只用中间数据格式,用于Python和R之间传递数据

  • 一般不用做保存最终数据

【了解】数据导出的其他方法

  • 将excel中的数据读出,并导出为json文件

pd.read_excel('scientists_df.xlsx').to_json('scientists_df.json')
  • 其他导出方法清单

导出方法 说明
to_clipboard 把数据保存到系统剪贴板,方便粘贴
to_dict 把数据转换成Python字典
to_hdf 把数据保存为HDF格式
to_html 把数据转换成HTML
to_json 把数据转换成JSON字符串
to_sql 把数据保存到SQL数据库

总结

  • 创建Series和DataFrame

    • pd.Series

    • pd.DataFrame

  • Series常用操作

    • 常用属性

      • index

      • values

      • shape,size,dtype

    • 常用方法

      • max(),min(),std()

      • count()

      • describe()

    • 布尔索引

    • 运算

      • 与数值之间进行算数运算会对每一个元素进行计算

      • 两个Series之间进行计算会索引对齐

  • DataFrame常用操作

    • 常用属性

    • 常用方法

    • 布尔索引

    • 运算

  • 更改Series和DataFrame

    • 指定行索引名字

      • dataframe.set_index()

      • dataframe.reset_index()

    • 修改行/列名字

      • dataframe.rename(index=,columns = )

      • 获取行/列索引 转换成list之后,修改list再赋值回去

    • 添加、删除、插入列

      • 添加 dataframe['新列‘']

      • 删除 dataframe.drop

      • 插入列 dataframe.insert()

  • 导入导出数据

    • pickle

    • csv

    • Excel

    • feather

总结的pandas数据结构 和需要掌握的知识点相关推荐

  1. Pandas数据结构

    Pandas数据结构 "一维数组"Serise Series "系列" Series 数据结构 Series 是带有标签的一维数组,可以保存任何数据类型(整数, ...

  2. 【pandas数据分析】pandas数据结构

    文章目录 Series 创建Series 从dict创建 从ndarray创建 从标量创建 Series的特性 类ndarray 类dict 向量化操作与标签对齐 名称属性 DataFrame 创建D ...

  3. pandas 入门(pandas 数据结构介绍)

    pandas 数据结构介绍 一.pandas 基础数据结构 1.pandas 中主要有两种数据结构:Series 和 DataFrame. 2.Series:一种一维的数组型对象,它包含了一个值序列( ...

  4. Pandas 数据结构

    Pandas处理以下三个数据结构 - 系列(Series) 数据帧(DataFrame) 面板(Panel) 这些数据结构构建在Numpy数组之上,这意味着它们很快. 维数和描述 考虑这些数据结构的最 ...

  5. Pandas数据结构:Series定义和创建

    文章目录 Series 定义 创建 Pandas中重要的两个数据结构:Series和DataFrame.数据分析必学的两种数据结构,这两种数据结构以Numpy的Ndarray为基础,在Ndarray的 ...

  6. Python数据分析——pandas数据结构(DataFrame)

    一.pandas数据结构–DataFrame DataFrame 是表格型的数据结构,每列值的数据类型可以不同,也可以相同 DataFrame 常用于二维数据. DataFrame 的属性: valu ...

  7. python数据分析包pandas论文_python数据分析pandas包入门学习(一)pandas数据结构介绍...

    本文参考<利用python进行数据分析>的第五章 pandas入门python 1 pandas数据结构介绍 pandas有两种主要的数据结构:series和DataFrame Serie ...

  8. pandas数据结构:Series/DataFrame;python函数:range/arange

    1. Series Series 是一个类数组的数据结构,同时带有标签(lable)或者说索引(index). 1.1 下边生成一个最简单的Series对象,因为没有给Series指定索引,所以此时会 ...

  9. Pandas数据结构简介

    Series Series 类似一维数组,由一组数据及一组相关数据标签组成.使用pandas的Series类即可创建. import pandas as pd s1 = pd.Series(['a', ...

最新文章

  1. 顺序表-元素逆置(首尾交换)
  2. 结合深度学习的图像修复怎么实现?
  3. Shiro + JWT + Spring Boot Restful 简易教程
  4. mysql树形结构查询_MySQL递归查询所有子节点,树形结构查询
  5. 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>
  6. python怎么开发软件_怎么使用python进行软件开发
  7. 运行APP脚本的步骤
  8. CSS3实现卡片翻转动画
  9. js如何实现扫描身份证识别_JavaScript实现身份证验证代码
  10. 【微信登录】APP/网站应用的微信扫码登录
  11. office文档管理服务器编辑,office在线编辑方案
  12. linux测试消息队列阻塞,Linux进程间通信:消息队列
  13. Power Apps 创建响应式布局
  14. 各省市大学 全国各个省市重点民办本专科大学
  15. 阿里云部署flask项目
  16. 新年新气象,重新出发
  17. Android Studio 必备技巧:TODO 用法及自定义 TODO
  18. 企业实战zabbix(7)--结合qqmail(报警信息发给qq用户)
  19. visualmap折线图_四、制作图表(复杂折线图)
  20. python图像纹理提取_提取图像的颜色、纹理特征(传统算法)

热门文章

  1. 一文简述服务器架构的演变过程:集群—分布式—微服务
  2. Python 十六进制,十进制转换
  3. 中国的读书人为何看不起刘邦李治亚的博客新浪博客
  4. 通过Ip查询对应地址,Ip2location全球IP地址网段
  5. 无人叉车市场现状与发展趋势分析|无人叉车专题(一)
  6. html语言单词背不下来,专八词汇背不下来?来看看这七种记忆方法
  7. 团购网站的销售额是怎么来的?
  8. Java300基础超适合零基础童鞋学习
  9. GIMP - 免费开源的图像处理软件,功能强大,被称为 Photoshop 的优秀替代品
  10. 最近成了叨客 - 注册了饭否,叽歪网