dataframe等常用操作


一、创建、取某列某行、删除某列

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)

 

 

 

 

 

参考:

 

后续再补充。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM