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 = '|')
pandas学习
最新推荐文章于 2023-07-04 23:40:34 发布