pandas学习

import pandas as pd
# 读取数据,将第一列时间转化为date格式
df = pd.read_csv('a.csv',index_col = 0,parse_dates= True)
df.head(5)  # 读取前5条数据
data.tail(10)  # 查看最后的数据

# 显示设置
pd.set_option()  # 具体查网页

# 属性
df.info()  # 返回数据中的信息
df.index  # 返回索引
df.columns  # 列名
df.dtypes  # 返回键和值的类型
df.values  # 返回键值

# 构造DataFrame对象
data = pd.DataFrame(data = [[1,2,3],[5,6,7]],index = [1,2],columns = ['A','B','C'])
data = {'name':['heyang','lisi'],'age':['26','28']}
pd.DataFrame(data)

# 生成Series对象
name = df['name'][:5]  # 索引键位name的所有前5信息,返回Series对象
s = pd.Series(data = [1,2,3],index = ['a','b','c'])

# 对Series运算
name += 5  # 给对应的键值+5
# 查
s[0]
s[:2]
mask = [True,False,False]
s[mask]
s.loc['b']
s.iloc[0]
# 改
s['a'] = 100
s.replace(to_replace = 100,value = 101,inplace = False) # 将100值改为101,不覆盖原始的
s.index = ['a','c','b']  # 改索引
s.rename(index = {'a':'A'},inplace = True)  # 将a索引改为A
# 增
s.append(s2,ignore_index = False)  # 按列增加s2(Series),保留原来索引
# 删除
del s['b']
s.drop(['j','d'],inplace = True)  # 删除i,d的索引行信息

# 对DataFrame运算
# 查 - 看下方索引
# 改
df.loc['a']['A'] = 150
df.index = ['f','g']
# 增
df.loc['c'] = [1,2,3]  # 增行
df['D'] = [10,2]  # 增列
df.concat([df,df2],axis = 0)  # 垂直增加df2
df.concat([df,df2],axis = 1)  # 水平增加df2
# 删除
df.drop(['j'],axis = 0,inplace = True)  # 删除行
df.drop(['A'],axis = 1,inplace = True)  # 删除列
del df['A']  # 删除列

# merge操作
pd.merge(left = left,right = right)  # 将left,right按照相同列参数合并,left在左边
pd.merge(left = left, right = right,on = ['key','key2'])  # 目标是合并,那么on的值就指定谁是合并的列
# 若left,right中有多个相同的键,按照一个键合并时,其余相同键会加上_x,_y后缀用来分别
# 若合并的键的列值不同,那么结果会去掉不一致的行,交集
pd.merge(left,right,on=['key1','key2'],how='outer',indicator=True)  # 会显示不同的列值的一行,不存的列值用NaN填充,并显示merge方式
pd.merge(left,right,on=['key1','key2'],how='left')  # 左表为基准
pd.merge(left,right,on=['key1','key2'],how='right')  # 右表为基准
# join
left.join(right,on = 'key')  # 关键字为key,right水平加left

# 统计
age.mean()  # Series对象均值
age.sum()  # Series对象
age.max()  # Series对象
df.describe  # DataFrame对象,对整个数据形成统计指标
df.sum()  # 默认按列求和
df.sum(axis = 1)  # 按指定轴1(行)求和
df.mean()
df.min()
df.median()
df.cov()  # 协方差
df.corr()  # 特征相关系数
df['age'].value_counts(ascending = True, bins = 5)  # 按键统计数量,升序,分5组
df['age'].count()  # 统计键的数据数量

# 索引
df = pd.read_csv('a.csv')
name = df['name'][:5]
df[['name','age']]  # 定位两个索引信息
df.set_index('name')  # 设置索引为name

# 索引2
s = pd.Series(np.arange(5),index = np.arange(5)[::-1],dtype = np.int32)
# 判断数据是否在集合中,返回索引
s.isin([1,3,4])
s2 = pd.Series(np.arange(6),index = pd.MultiIndex.from_product([[0,1],['a','b','c']]))
s2.iloc[s2.index.isin([(1,'a'),(0,'b')])]
s[s>2]
df = pd.DataFrame(np.random.randn(8,4),index = dates,columns=['A','B','C','D'])
df.where(df < 0)
df = pd.DataFrame(np.random.rand(10,3),columns = list('abc'))
df.query('(a<b) & (b<c)')

# 定位具体数据
df.iloc[0:5]  # 按照索引定位0-4共5个索引数据
df.iloc[0:5,1:3]  # 按照索引定位0-4,取1-2列
df.loc['heyang']  # 定位一个标签的信息
df.loc['heyang':'lisi']  # 按照索引找范围内数据
df.loc['heyang','age'] = 14  # 改数据
df['age'] > 40  # 返回大于40的索引
df.loc[df['age'] > 18,'name']  # 查找条件为年龄大于18的名字

# groupby
df = pd.read_csv('a.csv')
df.groupby('sex')['age'].sum()  # 按性别分组,求年龄总和

# 数据透视表
df = pd.read_csv('a.csv')
# 按index索引,键为columns,统计值为values,默认为sum,可以加入aggfunc = 'max'选择统计值的形式
example_pivot = example.pivot_table(index = 'Category',columns = 'Month',values = 'Amount')
example_pivot.sum(axis = 0)  # 求列和
example_pivot.sum(axis = 1)

# 时间操作
# 构造时间
t = pd.Timestamp('2018-4-21')
pd.to_datetime('2018-4-21')
# 索引时间
t.month
data[pd.Timestamp('2012-01-01 09:00'):pd.Timestamp('2012-01-01 19:00')]
# 第二种拿时间方式
data.between_time('08:00','12:00')
# 时间序列重采样,之前是每3小时的样本,之后想看一天平均值
data.resample('D').mean().head()
# 表达式寻找序列
data[data.index.month == 1]
data[(data.index.hour >8) & (data.index.hour < 12)]
# Timedelta是两个时间的差值,用来+/-算日期/时间
ts + pd.Timedelta('5 days')
s = pd.Series(data = ['2018-4-21','2018-4-22','2018-4-22'])
# 转成datetime格式
ts = pd.to_datetime(s)
ts.dt.weekday
# 构造时间序列
pd.Series(pd.date_range(start = '2018-4-21',periods = 3,freq = '24H'))

# 排序操作
data.sort_values(by = ['group','data'],ascending = [False,True],inplace = True)
# 去掉重复数据
data.drop_duplicates(subset = 'ka')
# 合并同类
def food_map(series):
    if series['food'] == 'A1':
        return 'A'
    elif series['food'] == 'A2':
        return 'A'
# apply 对数据行/列做操作
# 以data为参数,调用food_map返回结果,命名为food_map并在列上填充
data['food_map'] = data.apply(food_map,axis = 'columns')
# 加一列
df.assign(ration = df['data1']/df['data2'])
# 删除一列
df2.drop('ration',axis = 'columns',inplace = True)
# 替换
data = pd.Series(data=[1,2,3,4,5,6,7,8,9])
data.replace(2,np.nan,inplace = True)
# 将数据分区间,返回对应索引的区间
age = [15,44,66,22,41]
bins = [10,20,30,40,50,60,70]
bins_res = pd.cut(age,bins)
# 统计各区间的值
pd.value_counts(bins_res)
# 可以指定bins也可以直接写
pd.cut(age,[10,30,50,80])
# 改变列名
group_names = [
    'Youth','Mille','Old'
]
#pd.cut(age,[10,20,50,80],labels = group_names)
pd.value_counts(pd.cut(age,[10,20,50,80],labels = group_names)
# 看是否有NaN
df.isnull()
# 有NaN用5填充
df.fillna(5)
# 找到NaN位置
df[df.isnull().any(axis = 1)]

# groupby操作
df = pd.DataFrame({'A':['foo','bar','foo','bar','foo','bar','foo','foo'],
                  'B':['one','one','two','three','two','two','one','three'],
                  'C':np.random.randn(8),
                  'D':np.random.randn(8)})
df.groupby('A').count()  # 用A分组,计算数量
# 定义函数,返回索引,并按该索引进行分组计数
def get_letter_type(letter):
    if letter.lower() in 'aeiou':
        return 'a'
    else:
        return 'b'
df.groupby(get_letter_type,axis = 1).count()
# 索引层级
s = pd.Series([1,2,3,1,2,3],[8,7,6,8,7,6])
# 将索引是一样的分开了并取消默认排序
grouped = s.groupby(level = 0,sort = False)
grouped.first()
grouped.last()
# 分组后获取元素
df2 = pd.DataFrame({'X':['A','B','A','B'],
                   'Y':[1,2,3,4]})
df2.groupby(['X']).get_group('A')
# 统计
grouped = s.groupby(level = 0)
grouped.sum()
grouped = s.groupby(level = 'second')
grouped.sum()
grouped = df.groupby('A')
grouped['C'].agg([np.sum,np.mean,np.std])

# 字符串操作
s = pd.Series(['A','B','B','g','A',np.nan])
s.str.lower()  # 转小写大写
s.str.upper()  # 转大写小写
# 长度
s.str.len()
# 去掉空格
index.str.strip()  # lstrip,rstrip
df = pd.DataFrame(np.random.randn(3,2),columns = ['A a','B b'],index = range(3))
# 改列名
df.columns = df.columns.str.replace(' ','_')
# 切分
s = pd.Series(['a_b_c','c_d_e','f_g_h'])
s.str.split('_')
# 切分形成新列
s.str.split('_',expand = True)
# 限制切分列
s.str.split('_',expand = True,n = 1)
# 查看是否包含元素
s.str.contains('A')
s = pd.Series(['a','a|b','a|c'])
# 切分开,看一共有多少可能性
s.str.get_dummies(sep = '|')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值