常用的pandas命令:行列 row,column
pandas 基本的数据结构是 Series(数组) 和 DataFrame(类似二维数组),
Pandas 提供了 Index 对象,每个 Series 都会带有一个对应的Index,用来标记不同的元素,Index 的内容不一定是数字,也可以是字母、中文等,它类似于SQL中的主键。
1.Dateframe的查询
(1)loc——loc&iloc函数:
loc函数:通过行索引 “Index” 中的具体标签来取行数据(如取"Index"为"A"的行)
iloc函数:通过行号(位置)来取行数据
如:
data.loc[‘a’] #即取索引为a的行
data.loc[:,[‘A’]] #取’A’列所有行,多取几列格式为 data.loc[:,['A','B']]
data.iloc[:,[0]] #取第0列所有行,多取几列格式为 data.iloc[:,[0,1]]
利用loc函数,根据某个数据来提取数据所在的行
data.loc[data[‘A’]==0] #提取data数据(筛选条件: A列中数字为0所在的行数据)
data.loc[(data['A‘]==0) & ([data['data_io']>'2018-05-08') ]
(2)isin——使用isin函数根据特定值筛选记录
如:df[df.a.isin([30,54])] #即筛选a值=30或54的记录
如:pi_df = pi_df.loc[~pi_df.index.isin(s_df_main.index)].copy()
#从pi_df中筛选index不在s_df_main中的行
(3)at函数
根据指定行index及列label,快速定位DataFrame的元素,选择列时仅支持列名。
df.at[3,‘a’]
若列用index,则可用iat函数,如:df.iat(3,‘a’)
(4) 多条件筛选
可以使用&(并)与| (或)操作符或者特定的函数实现多条件筛选
df[(df[‘a’] > 30) & (df[‘b’] > 40)]
使用&筛选a列的取值大于30,b列的取值大于40的记录
先取出index,再合并set,进而isin
a = valid_i0.reset_index().set_index('cols').index.unique()
b= valid_s.reset_index().set_index('cols').index.unique()
ab_valid = set(po_valid_i0) | set(po_valid_s)
c.set_index('cols', inplace=True)
c = c.loc[(c['is_store'] != 1) | (po.index.isin(po_valid))].copy()
po.reset_index(inplace=True)```
(5)index 即重置行名
如:df.index=[‘aa’,‘bb’,‘cc’,‘dd’] #即重置行名为aa,bb,cc,dd
2.DataFrame的index、列名等的重置、排序
(1)set_index
设置索引列。
如:
new_df_drop_t = df.set_index(‘A’) #设置A列为索引列,同时删去之前的列
new_df_drop_f = df.set_index(‘A’,drop=False) #设置A列为索引列,并不删去之前列
加上inplace='True',原有表名称发生变化,如mng_wh_info
mng_wh_info.set_index('org_id', inplace=True)
mng_wh_info.sort_index(inplace=True)
(2)reset_index()
reset_index还原分为两种类型,
第一种是对原DataFrame进行reset,
new_reset_index = df.reset_index(drop=False) # 原有的索引不变添加列名index,同时在新列上重置索引
new_reset_index = df.reset_index(drop=True) # 在原有的索引列重置索引,不再另外添加新列
第二种是对使用过set_index()函数的DataFrame进行reset
new_reset_index = newdf.reset_index(drop=False) #索引列会被还原为普通列 默认的
new_reset_index = newdf.reset_index(drop=True) #索引会被直接删除
(3)按照某一列的大小进行排序
sort_index()
sort_index(axis=0,ascending=True)
参数说明
axis:0按照行名排序;1按照列名排序
ascending:默认True升序排列;False降序排列
如:
将’Date’设置为行索引并按时间排序:
app.set_index(‘Date’,inplace=True)
app.head()
sort_values()
DataFrame.sort_values(by=[’’], axis=0, ascending=True)
参数说明
axis:{0 or ‘index’, 1 or ‘columns’}
by:str or list of str;如果axis=0,那么by=“列名”;如果axis=1,那么by=“行名”;
ascending:True升序,可以是[True,False],即第一字段升序,第二个降序
(4)rename(columns = {……},inplace=‘True’)改变列名:
如:
第一种修改方法
df_rename = df.rename({'a': 're_a', 'b': 're_b', 'c': 're_c', 'd': 're_d'}, axis='columns')
或者:
df_rename({columns='A':'a','B':'b'},inplace='True')
#即把列中的a,b,c,d分别变为re_a,…
第二种修改方法
df_rename = df.rename(index={"07-01": 71, "07-02": 72, "07-03": 73},
columns={'a': 're_a', 'b': 're_b', 'c': 're_c'})
#即把行的index变,把列变为re_a,…
3.数据的清洗
(1)drop_duplicates()
对DataFrame格式的数据,去除特定列下面的重复行。返回DataFrame格式的数据。
data.drop_duplicates([‘k2’]) #对特定列k2去重
df.drop_duplicates(subset=['B'],keep=first,inplace=True)
#只考虑B列(默认为所有列),keep=first默认保留第一次出现的值
df.drop_duplicates(subset=[a', 'b'], inplace=True)
# a列和b列去重
(2)drop() drop([],axis=1,inplace=‘True’)
删除 Series 的元素或 DataFrame 的某一行(列)
如:df.drop([‘oh’,‘te’],axis=1) # 删除oh,te列
(3)dropna()
删除含有空数据的全部行
df4 = df4.dropna(axis=1)# 通过axis参数来删除含有空数据的全部列
df4 = df4.dropna(subset=[“age”, “sex”])# subset参数删除在age和sex中含有空数据的全部行
(4)fillna()
df1.fillna(100) #用常数100填充空格/缺失数据/NAN
通过字典填充不同的常数:
df1.fillna({0:10,1:20,2:30})#第1,2,3,列分别填充10,20,30
4.两个DataFrame的合并
(1)append()
(2)concat()沿着一条轴,将多个对象堆叠到一起
axis是关键,它用于指定是行还是列,axis默认是0,列;1,行
如:
frames = [df1, df2]
pd.concat(frames) #拼接df1及df2,上面是df1,下面是df2
pd.concat([df1,df1],ignore_index=True)
默认ignore_index=False,此时后面的DataFrame中的索引直接拼接在后面,
而ignore_index=True的时候,后面的索引直接全部改变成数字。
(3)merge() 通过键拼接列 默认去交集inner
针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面。
pd.merge(df1, df2[['a', 'b', 'c']].drop_duplicates(), how='inner', on=['a', 'b', 'c'])
df1,和df2中都存在a,b,c三列,将abc作为公共列予以合并
how=inner,left,right,outer,保留公共,左边表,右边表,都保留的意思
join() 少用
c = a.join(b, how='inner')
5.数据的处理
groupby().sum()
df1=df.groupby(['a','b','c','d','e'])[['quant_io']].sum()
以abcde作为一组,对quant_io求和
groupby().apply()#apply里跟各种函数
如:
groupby(‘A’).apply(np.mean)与groupby(‘A’).mean()计算结果是一致的
或:
df1=df['quant_io'].apply(np.sign) 符号函数,直接判断quant_io是否为正,0,1
具体
df['qty'][df['qty']<0]=0
df1=df['qty'].apply(np.sign)
其它:
(1)[]
选择列,选择行
df[‘A’] 通过name(键)选择列
df[[‘A’,‘B’]] 通过list选择列
df[0:3]通过index所在行选择行
df[‘20130102’:‘20130104’] 通过行index(键)选择行
dataset[(dataset[‘Sex’] == i) & (dataset[‘Pclass’] == j+1)][‘Age’] #布尔运算选择数据,以其他列为条件筛选数据,注意做布尔运算时最好将每个运算用括号括起来,像以下这种就会容易出问题:dataset[dataset[‘TARGET’].notnull() & dataset[‘need_pre’]!=1 ]
加不加[],生成的类型是不同的
type(data[“A1”])
pandas.core.series.Series
type(data[[“A1”]])
pandas.core.frame.DataFrame
类型
df[‘quant_io’] = df[‘quant_io’].astype(int) 强制将quant_io列转换成int整型
df.dtypes 检测dataframe df的类型
创建Dataframe
import pandas as pd
df1 = pd.DataFrame([[[1,2,3],[1,10,20]],columns=['x1','x2'])
或
df = pd.DataFrame({'a':['a0','a1'],'b':['b1;,'b2'],'c':['c1','c2','c3']})