series 相当于一维数组
要有向量化操作思想
- series是类似一维数组的对象,即一个列向量
- 初始化series
①通过列表初始化series,默认数字为索引
ser_obj=pandas.Series(list)
②通过字典初始化series,字典的key为索引
country_dicts = {'CH': '中国',
'US': '美国',
'AU': '澳大利亚'}
country_dict_s = pd.Series(country_dicts)
- 索引
series除数字索引外,还可以通过列名进行索引
通过索引拿到一个数据
①通过数据所在位置访问数据iloc
print('iloc:', country_dict_s.iloc[1]) #结果iloc: 中国
②通过默认的索引访问数据loc
print('loc:', country_dict_s.loc['US']) #结果loc: 美国
③通过下标访问数据[],其实用的就是loc
print('[]:', country_dict_s['US']) #结果 []: 美国
通过索引拿到多个不连续数据
通过数据所在位置,把索引放在一个list中进行访问
print('iloc:\n', country_dict_s.iloc[ [0, 2] ]) #通过位置
print('loc:\n', country_dict_s.loc[['US', 'AU']]) #通过索引
-
获取数据和索引
ser_obj.index #获取索引,返回的是RangeIndex即Index对象
ser_obj.values #获取数据,返回的是数组
ser_obj.head(10) #预览数据
-
pandas处理缺失数据
输入数据时,我们把缺失的数据写为None,pandas会根据此列表中大部分数据时什么类型来确定series的类型,none也会根据不同的series类型有不同的值
numbers = [4, 5, 6, None] #列表中除缺失数据None外,其它都是数字
print(pd.Series(numbers)) #输出结果类型为float,pandas自动可以把none处理成NAN
countries = ['中国', '美国', '澳大利亚', None] #列表中除缺失数据外为字符串
print(pd.Series(countries))
A是错误的,因为把index去掉后,就只有一个10,则默认生成的索引为0
D相当于是广播操作
DataFrame 相当于二维数组
类似于多维数组/表格数据
每列数据可以是不同的数据类型
import pandas as pd
country1 = pd.Series({'Name': '中国','Language': 'Chinese','Area': '9.597M km2','Happiness Rank': 79})
country2 = pd.Series({'Name': '美国','Language': 'English (US)',
'Area': '9.834M km2','Happiness Rank': 14})
country3 = pd.Series({'Name': '澳大利亚','Language': 'English (AU)','Area': '7.692M km2','Happiness Rank': 9})
df = pd.DataFrame([country1, country2, country3], index=['CH', 'US', 'AU']) #因为是用字典创建的series,则key为dataframe中列的索引
②
dt={0:[9,8,7,6],1:[3,2,1,0]}
a=pd.DataFrame(dt) #得到了两列数据列名为0和1
- 增加列数据,类似dict添加key-value
因为dataframe中是列优先的,所以直接[]就认为是添加的列的数据
如果个数小于要求的个数,会自动进行“广播”操作
df_obj[new_label] = data
eg:df['Region'] = ['亚洲', '北美洲', '大洋洲']
print(df.loc['CH'])
print(df.iloc[1])
②列索引 什么也不加,直接通过列名索引
print(df['Area'])
print(df[['Name', 'Area']]) #获取不连续的列数据
③混合索引
<1>先取列,再取行
先取列,因为默认列优先,所以什么也不用加
取出的数据类型为series,所以取行的时候就可以用series的索引方式
print(df['Area']['CH'])
print(df['Area'].loc['CH'])
print(df['Area'].iloc[0])
<2>先取行,再取列
先取行所以要加loc或iloc
print(df.loc['CH']['Area'])
print(df.iloc[0]['Area'])
- 删除数据
删除行数据
①drop,但drop是复制一份进行删除,不会修改原数据
print(df.drop(['CH'])) #输出的是删除ch后的df
print(df) #输出的df中df还在
②要在原数据中删除数据
print(df.drop(['CH'], inplace=True))
删除列数据,需要指定axis=1
print(df.drop(['Area'], axis=1))
从DataFrame中取出的数据进行操作后,会对原始数据产生影响
ranks = df['Happiness Rank']
ranks += 2 #这里对ranks中的rank都加2后,df中的rank也会加2
为了对原始数据不产生影响,要采用copy操作
ranks = df['Happiness Rank'].copy()
ranks += 2 #ranks中的rank加2,df中不变
index对象
- 常见的Index种类
①index
②int64index
③DatetimeIndex,时间戳类型
④MultiIndex,层级索引
区域当成外索引,即一级索引;国家当成内索引,即二级索引
设置层级索引set_index,列表中最左边是一级。
report_2015_df2 = reprot_2015_df.set_index(['Region', 'Country'])
但这样得出来数据的原始位置不改变,即外索引会一直重复出现,
把索引号进行排序后则相同的索引就会放到一起
report_2015_df2.sort_index(level=0) #level为0即按外部索引进行排序
reprot_2016_df.index[0] = '丹麦' #会报错
reprot_2016_df = pd.read_csv('./2016.csv',
index_col='Country',
usecols=['Country', 'Happiness Rank', 'Happiness Score', 'Region']) #将国家名作为索引
- 重置Index,把原来的索引当成普通的一列,也就是将索引重新赋值为0-1
reprot_2016_df.reset_index(inplace=True) #加inplace是对原来的数据也进行修改
reprot_2016_df.reset_index() #不加是只对复制的数据进行修改
reprot_2016_df.rename(columns={'Region': '地区', 'Happiness Rank': '排名', 'Happiness Score': '幸福指数'},
inplace=True)
boolean mask
布尔遮罩即过滤出来自己想要的那些数据
reprot_2016_df[(reprot_2016_df['地区'] == 'Western Europe') & (reprot_2016_df['排名'] > 10)]
pandas读取csv
reprot_2015_df = pd.read_csv('./2015.csv')
print(reprot_2015_df.info()) #输出各列的数据类型等
- 输出读入数据的统计信息describe(),即count,mean,std,min,四分位数等
print(reprot_2015_df.describe())
主要是知道一下这两者的区别,因为有的操作只能对dataframe进行操作
to_frame 可以把series转化成dataframe