一、创建、取某列某行、删除某列
import pandas as pd lst=[2,3,5] #表示df的一行 df=pd.DataFrame(data=[lst,lst],columns=['col1','col2','col3']) #从列表生成DF df=pd.DataFrame(data={'col1':[2]*2,'col2':[3]*2,'col3':[5]*2})#字典生成DF df[['col1','col2']]#可以取出对第一、二列的数据 df[2:][['col1','col2']] #可以取出第2行到最后一行的第1、2列的数据 df.drop('col1',axis=1)#删除第1列 df.drop(['col1','col2',axis=1]) pd.read_csv(file_path,header=None,index_col=0,encoding='utf-8',skiprows=2) #index_col表示设置第0列为index列,skiprows表示跳过前2行读取数据,前2行即第[0,1]行。 #若index_col=False则表示index列为默认的另外的列 df.to_csv(path,index=False) #index=False表示保存的csv不带index,否则默认情况下保存的csv是默认写入index列的
df.to_hdf('data.h5','df')
pd.read_hdf('data.h5','df')#写入读取HDF5数据
二、对一列或者多列作运算
1. 利用map对一列作运算
df['col'] = df['col1'].map(lambda x: x**2) #生成一列,是第1列的平方
2.利用apply对一列或多列作运算
df.index = pd.date_range('20190101',periods=5) #将原来的index改成以日期为index df['col'] = df.apply(lambda x:x['col1']*x['col2'], axis=1) #对'col'列改写成'col1'列的对应行乘以'col2'列的对应行
三、求滑动平均
df['MA'] = df['col'].rolling(window=3, center=False).mean()
四、对列作向上或向下的平移变换
df = pd.DataFrame({'id':[1,1,1,2,2,3],'value':[1,2,3,4,5,6]}) df['value_shift'] = df.groupby('id')['value'].shift(1) #按id列分组,对value列进行平移变换,即都向下移动1行 df['value_shift_1'] = df.groupby('id')['value'].shift(-1) #按id列分组,对value列进行平移变换,即都向上移动1行
五、对列作标准化处理:
from sklearn import preprocessing df = pd.DataFrame({'id':[1,1,1,2,2,3],'value1':[1,2,3,4,5,6],'value2':[1,3,4,3,7,2]}) value=df[['value1','value2']] value_T=value.transpose() #value_T是array类型 scaler=preprocessing.StandardScaler().fit(value_T) #scaler是对行数据作标准化,所以对df的列数据应该将其转置 value_T_scale = scaler.transform(value_T) value_scale = value_T_scale.transpose() #有时需要用到np.array的reshape: y=df[['value']] #y.shape=(6,1) y=y.reshape(1,-1) #y.shape=(1,6) y=y.reshape(-1,1) #y.shape=(6,1)
y=np.repeat(0,len(y)) #生成零矩阵
六、对某列赋值
df = pd.DataFrame({'id':[1,1,1,2,2,3],'value':[1,2,3,4,5,6]}) value=[11,22,33] df.loc[df.index[0:3],'value']=value df.loc[df.index[0:3], 'value0']=value
七、 对list中多个重复的字符作频数统计
lst=['a','a','a','b','c','c','b','e','f','a','a','c'] cnt = pd.Series(lst).value_counts()
八、随机抽样
DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
- n:随机抽取n行数据
- frac:随机抽取的比例
- replace:True有放回抽样;False不放回抽样
- random_state:随机数种子生成器
- axis:0按行抽取,1按列抽取
若frac=1可将样本作打乱处理
九、清洗数据
df[df.isnull()] df[df.notnull()] df.dropna()#将所有含有nan项的row删除 df.dropna(axis=1,thresh=3) #将在列的方向上三个为NaN的项删除 df.dropna(how='ALL')#将全部项都是nan的row删除填充值 df.fillna(0) df.fillna({1:0,2:0.5}) #对第一列nan值赋0,第二列赋值0.5 df.fillna(method='ffill') #在列方向上以前一个值作为值赋给NaN
十、数据筛选
聚合函数
groupby(df['支局_维护线']) df.groupby('支局_维护线')['用户标识'] #上面的简单写法 df.groupby('支局_维护线')['用户标识'].agg([('ADSL','count')])#按支局进行汇总对用户标识进行计数df,并将计数列的列名命名为ADSL
合并函数(类似SQL中的JOIN)
x=df[df['post_time'].isin(['2018-12-25'])]
y=pd.merge(df,x,left_on='username',right_on='username',how='inner',suffixes='_df','_x')#内连接,连接两边都有的值
#inner(内连接)、outer(外链接)、left(左连接)、right(右连接)
#suffixes表示连接的列如果属于df就在其列名后面加'_df',否则会默认加为'_x','_y'
y=pd.merge(df,x,on='username')#内连接,连接两边都有的值
数据筛选
x=df[df['username'].str.contains(r'潮州*')] #使用正则表达式进行模糊匹配,*匹配0或无限次,?匹配0或1次 #使用DataFrame进行数据转换 x['username'] = x['username'].str.replace()#replace的括号里使用正则表达式
十一、concat
pd.concat([df1,df2,df3])#默认axis=0,按行合并
pd.concat([df1,df4],axis=1)#按列合并
pd.concat([df1, df4], ignore_index=True)#忽略索引信息,重排索引0,1,2,3....
pd.concat([df1, df4], axis=1, join=‘inner’)#内连接合并,join默认为outer外连接。
pd.concat([df1,df2,df3],keys=[‘x’, ‘y’, ‘z’]) #合并时便于区分建立层次化索引
十二、删除drop,替代replace
import pandas as pd import numpy as np df1=pd.DataFrame(np.random.randn(4,3),columns=["A","B","C"]) print(df1) df2=df1.drop(["A"],axis=1,inplace=True)#inplace=True表示在原df上操作,不生成新的df;axis=1表示对列进行操作 print(df1) print(df2) df2=df1.drop(["B"],axis=1,inplace=False)#inplace=False表示不在原df上操作,生成新的df;axis=1表示对列进行操作 print(df1) print(df2)
结果如下:
import pandas as pd df1=pd.DataFrame({'country':['A','A','C','B','C'],'province':[1,2,1,2,3],'people':[2,4,6,7,1]}) print(df1) country=df1['country'].value_counts() to_remove=country[country<2].index print(to_remove) df1.replace(to_remove, np.nan, inplace=True) #inpace=True表示在原df上操作,不生产新的df print(df1)
df1.replace({'A':'B','C':'E'}) #替换多个值 print(df1)
注、一些常用介绍
df.describe() #描述性统计(对数值型数据列而言) df.dtypes #查看各行的数据格式 df['列名'].astype(int)#转换某列的数据类型
res_df['T'] = res_df['T'].apply(int) #切片操作 df.iloc[1:10] #获取1-10行的数据 df.iloc[columns_index] #获取列的数据 df.iloc[1:5,[1,2,5]]#获取1,2,5列的1~5行数据 df[columns].drop_duplicates() #剔除重复行数据 df.iloc[1:5,[1,2,5]]=1#所选位置数据替换为1 #使用DataFrame筛选数据(类似SQL中的WHERE) df['post_time'].isin(['2018-12-25']) #使用isin对数据进行筛选,返回行索引以及每行筛选的结果,若匹配则返回ture df[df['post_time'].isin(['2018-12-25'])] #获取匹配结果为ture的行 from datetime import datetime x='2018-12-31 17:51:33' print(datetime.strptime(x,"%Y-%m-%d %H:%M:%S"))#将时间字符串解析为时间元组 x=datetime.strptime(x,"%Y-%m-%d %H:%M:%S") print(x.strftime("%Y-%m-%d")) #将时间元组转化成时间字符串
当某csv文件打开有错误时,可以尝试:
df=pd.read_csv('../data/train.csv',header=None,index_col=None,error_bad_lines=False) #跳过出现错误的行
按照某列和某列来做频数统计(适用于属性数据),类似R语言中的table:
data.groupby(['post_time', 'senti_label']).size()
按照某列来对某列做j简单的运算:
data.groupby(['post_time'])['senti_label'].sum() #统计每一天的数据
gubaData.groupby('Date')['read_number'].max() #按照日期'Date'列统计‘read_number’的最大值
按照索引合并两个DF:
x=pd.merge(df,sentiD,left_index=True,right_index=True,how='inner')
df = pd.merge(df1, df2, how = 'left', left_index = True, right_index = True) #两者有相同的index,且要将df2合并到df1中
在array后面添加元素:
d=np.array([1,2,3]) np.append(d,[4,5]) #array([1, 2, 3, 4, 5]) np.concatenate([d,[9,8]]) #array([1, 2, 3, 9, 8])
删除某列例如A列中的含有nan的行:
df.drop(df[np.isnan(df['A'])].index, inplace=True)
当有两个df,两个df的列名有的相同,有的不相同,需要取其都具有的列名的名称:
#首先将两个df的列名取出来放在类似下面的x1,x2中;再如下方式取其共同的元素 x1=pd.DataFrame({'x':[1,2,3] },index=[1,2,3]); x2=pd.DataFrame({'x':[4,3,5]},index=[3,4,5]) print(x1.index.difference(x2.index)) # 取不属于X2.index的 X1.index 中的元素 print(x1.index.difference(x1.index.difference(x2.index))) # 取x1.index和X2.index都包含的元素
取train和valid的一种方式:
x1=pd.DataFrame({'x':range(10)}) t = x1.sample(7,random_state=7) v = x1[~x1['x'].isin(t['x'])] # ~表示非,则取x1['x']中 不属于t['x'] 的元素对应的x1数据 print(t) print(v)
取train中非’class‘的其他所有列:
train[train.columns.difference(['class'])]
具有相同列的两个df按照行合并起来:
df1.append(df2)
删除相同行:
x=pd.DataFrame({'a':[1,1,2,3],'b':[2,2,2,4]}) print(x,'\n') x=x.drop_duplicates() #去掉重复的行 print(x)
巧用map:
x=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]}) x['sum']=list(map(lambda a,b:a+b,x['a'],x['b'])) print(x)
指数滑动平均:
cc=pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9,10]}) cc.ewm(span=3).mean()
由上例看一下如何计算的:span=3,adjust默认为True,
则alpha=2/(3+1)=0.5;计算上例中cc.index=2的指数平均值为:
当adjust=False时,
zip,lambda,map:
zip接受多个序列作为参数
lambda定义一个简单函数,实现简化代码的功能
map把函数和参数绑定在一起
a=[1,1,1] b=[2,2,2] c=[3,3,3] abc=zip(a,b,c) # print(list(abc)) for i,j,k in abc: print(i,j,k) fun=lambda x,y:x+y print(fun(1,2)) list(map(fun,[1,2,3],[3,4,5]))
python中没有 “condition ? value1 : value2 ”三目操作符,但是可以如下简洁操作ifelse:
x="Yes" if True else "No" print(x) x="Yes" if False else "No" print(x)
参考:
- 《Python数据科学手册》Jake Vanderplas,可参考这里
- pandas官方文档
-
Pandas拼接操作(concat,merge,join和append)的区别
- https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.ewm.html
- https://www.cnblogs.com/nxf-rabbit75/archive/2019/04/08/10669516.html
后续再补充。