pandas之DataFrame与Series实例详解

import numpy as np
import pandas as pd


# =====pandas数据结构:1、Series对象;2、DataFarme对象======
# =========创建一个Series对象==========
# 参数data:可以是任意数据对象,比如:字典、列表、numpy数组,(不能为空)
# 参数index:是对data的索引值,类似字典的key,(可省略)
# my_series = pd.Series(data, index)
countries = ['USA', 'Nigeria', 'France', 'Ghaha']
my_data = [100, 200, 300, 400]
my_series_01 = pd.Series(my_data, countries)
#print(my_series_01)

my_series_02 = pd.Series(my_data)
#print(my_series_02)

my_data_02 = {'a':50, 'b':60, 'c':70, 'd':80}
my_series_03 = pd.Series(my_data_02)
#print(my_series_03)

# ===========从Series中获取数据==============
# 访问Series中的数据类似与Python中字典
series_data_01 = my_series_01['USA']
#series_data_01 = my_series_01['Nigeria']
#series_data_01 = my_series_01['France']
#series_data_01 = my_series_01['Ghaha']
#print(series_data_01)

series_data_02 = my_series_02[0]
#series_data_02 = my_series_02[1]
#series_data_02 = my_series_02[2]
#series_data_02 = my_series_02[3]
#print(series_data_02)

series_data_03 = my_series_03['a']
#series_data_03 = my_series_03['b']
#series_data_03 = my_series_03['c']
#series_data_03 = my_series_03['d']
#print(series_data_03)

# ==========对Series进行算数运算操作===========
# 对 Series 的算数运算都是基于 index 进行的,如果 Pandas 在两个 Series 里找不到相同的 index,对应的位置就返回一个空值 NaN。
#jisuan_01 = my_series_01 - my_series_02
#jisuan_01 = my_series_01 + my_series_02
#jisuan_01 = my_series_01 * my_series_02
jisuan_01 = my_series_01 / my_series_02
#print(jisuan_01)

# ============构建一个 DataFrame 对象===========
# 看,上面表中的每一列基本上就是一个 Series ,它们都用了同一个 index。因此,我们基本上可以把 DataFrame 理解成一组采用同样索引的 Series 的集合。
# 即,我们可以将多个 Series 构建成一个 DataFrame
series_A = pd.Series(['Jon', 'Aaron', 'Todd'], index=['a', 'b', 'c'])
series_B = pd.Series(['39', '34', '32', '33'], index=['a', 'b', 'c',  'd'])
series_C = pd.Series(['US', 'China', 'US'],['a', 'b', 'c'])
#print(series_A)
#print(series_B)
#print(series_C)
df = {'Name': series_A,
      'Age': series_B,
      'Nationality': series_C
      }
my_datafarme_01 = pd.DataFrame(df)
#print(my_datafarme_01)

# 用字典创建 DataFarme
data = {'name': ['George', 'Ann', 'Tino', 'Charles', 'Phill'],
        'age':[40,24,31,21,23],
        'year':[2012,2012,2013,2014,2014]
        }
my_datafarme_02 = pd.DataFrame(data, index=['Lagos','Dubai', 'Mumbai', 'Accra', 'Yuma'])
my_datafarme_03 = pd.DataFrame(data)
#print(my_datafarme_02)
#print(my_datafarme_03)

# ===========获取 DataFarme 中的------列============
# 因为我们只获取了一列,所以返回的就是一个 Series,可以用 type()函数确认返回值的类型
df_data_01 = my_datafarme_02['name']
df_data_02 = my_datafarme_02['age']
df_data_03 = my_datafarme_02['year']
#print(df_data_01)
#print(df_data_02)
#print(df_data_03)
#print(type(df_data_01))

# 当我们获取多个列时,返回的就是一个 DataFarme 对象
df_data_04 = my_datafarme_02[['name','year']]
#print(df_data_04)
#print(type(df_data_04))

# ==========向 DataFarme 中增加数据----列========
# 1、可以先新定义一个 Series ,再把它放进 DataFarme 中
my_datafarme_02['sex'] = pd.Series(['F', 'M', 'M','F'],index=['Lagos','Dubai', 'Mumbai', 'Accra'])
#print(my_datafarme_02)
#
# 2、利用现有的列(Series)数据,生成新的列
my_datafarme_02['Birthday'] = my_datafarme_02['year'] - my_datafarme_02['age']
#print(my_datafarme_02)

# ==========从 DataFarme 中删除行/列========
# axis=0:对应的是行 row  ;axis=1:对应的是列 column
# 注意:在调用 .drop() 的时候,Pandas 并不会真的永久性地删除这行/列,这主要是为了防止用户误操作丢失数据;
#print(my_datafarme_02.drop('sex',axis=1))
#print(my_datafarme_02)
# 如果你确定要永久性删除某一行/列,你需要加上 inplace=True 参数。
#print(my_datafarme_02.drop('sex',axis=1, inplace=True))
#print(my_datafarme_02)

# ==========获取 DataFarme 中的 一行或多行 数据============
# 要获取某一行,你需要用 .loc[] 来按索引(标签名)引用这一行,或者用 .iloc[],按这行在表中的位置(行数)来引用。
#print(my_datafarme_02.loc['Lagos'])
#print(my_datafarme_02.iloc[0])

# ==========获取 某行 某列 的数据=============
# 提取 Lagos行,name列的而数据
#print(my_datafarme_02.loc['Lagos', 'name'])

# 提取 Lagos、Mumbai行,name、Birthday列的而数据
#print(my_datafarme_02.loc[['Lagos','Mumbai'],['name','Birthday']])

# ==========单个条件筛选===========
# 筛选出 age大于30的所有行,所有列
#print(my_datafarme_02[my_datafarme_02['age']>30])
# 筛选出 age大于30的 name、sex、age列
#print(my_datafarme_02[my_datafarme_02['age']>30][['name','age','sex']])

# ==========多个筛选条件===========
# 可以用逻辑运算符 &(与)和 |(或)来链接多个条件语句
# 例:筛选出age大于30且sex=F的所有行、所有列
#print(my_datafarme_02[(my_datafarme_02['age']>30) & (my_datafarme_02['sex']=='F')])

# ===========重置 DataFarme 的索引=========
my_datafarme_03 = pd.DataFrame(np.random.randn(5,4),['A','B','C','D','E'],['W','X','Y','Z'])
#print(my_datafarme_03)
# 如果你觉得当前 DataFrame 的索引有问题,你可以用 .reset_index() 简单地把整个表的索引都重置掉;
# 这个方法将把目标 DataFrame 的索引保存在一个叫 index 的列中,而把表格的索引变成默认的从零开始的数字,也就是 [0, ..., len(data) - 1] 
#print(my_datafarme_03.reset_index())
# 注意:和删除操作差不多,.reset_index() 并不会永久改变你表格的索引,除非你调用的时候明确传入了 inplace 参数,
#my_datafarme_03.reset_index(inplace=True)
#print(my_datafarme_03)

# ============设置 DataFarme 的索引值=============
# 我们还可以用 .set_index() 方法,将 DataFrame 里的某一列作为索引来用,.set_index() 将会完全覆盖原来的索引值。
# 1、新加入一列数据,然后再把他设置为索引
my_datafarme_03['ID'] = ['df1','df2','df3','df4','df5']
#print(my_datafarme_03)
#print(my_datafarme_03.set_index('ID'))

# ============多级索引 / 多级索引命名==============
# 多级索引:其实就是一个由元组(Tuple)组成的数组,每一个元组都是独一无二的。
#       你可以从一个包含许多数组的列表中创建多级索引(调用 MultiIndex.from_arrays ),
#       也可以用一个包含许多元组的数组(调用 MultiIndex.from_tuples )
#       或者是用一对可迭代对象的集合(比如两个列表,互相两两配对)来构建(调用MultiIndex.from_product )
# ------从元组中创建 多级索引-----
# 1、制作多级索引列表
outside = ['0 Level', '0 Level', '0 Level', 'A Level', 'A Level', 'A Level']
inside = [21, 22, 23, 20, 22, 24]
# 利用 list(zip()) 嵌套函数,把上面两个列表合并成了一个每个元素都是元组的列表。
my_index = list(zip(outside, inside))
#print(my_index)   -- [('0 Level', 21), ('0 Level', 22), ('0 Level', 23), ('A Level', 21), ('A Level', 22), ('A Level', 23)]
# 2、生成多级索引对象
my_index_01 = pd.MultiIndex.from_tuples(my_index)
print(my_index_01)
# 3、将多级索引施加在 DataFarme 表中(DataFarme表创建时)
my_datafarme_04_index = pd.DataFrame(np.random.randn(6,2), index=my_index_01, columns=['A','B'])
print(my_datafarme_04_index)

# --------------获取多级索引中的数据-----------
# 要获取多级索引中的数据,还是用到 .loc[] 。比如,先获取 'O Level' 下的数据;然后再用一次 .loc[],获取下一层 21 里的数据
print(my_datafarme_04_index.loc['0 Level'].loc[22])

# -------------给多级索引命名-------------
my_datafarme_04_index.index.names = ['Levels', 'Num']
print(my_datafarme_04_index)

# -------------交叉选择行和列中的数据---------
# 例:提取所有 Levels 中,Num=22 的所有行
print(my_datafarme_04_index.xs(22, level='Num'))

猜你喜欢

转载自blog.csdn.net/weixin_40873462/article/details/89520949