由于本人记性不好,每次使用都需要重新查询,因此自己总结一些常用方法,方便后续快速查阅
官网参考:pandas.DataFrame.merge — pandas 1.3.3 documentation
1. 引入包
import pandas as pd
2.读写文件
title_name = ['A','B','V'] pd.read_csv(file,sep='\t',header=None,low_memory=False,names=title_name,usecols=['A','B'],skiprows=1)
参数说明:
sep: 文件的分隔符
header: 如果没有列标,则为None
low_memory: 分块加载到内存,再低内存消耗中解析。但是可能出现类型混淆。确保类型不被混淆需要设置为False。或者使用dtype 参数指定类型。注意使用chunksize 或者iterator 参数分块读入会将整个文件读入到一个Dataframe,而忽略类型(只能在C解析器中有效) 默认是True 这样可能导致同一列既有int又有str
names: 如何没有列标,指定列标
usecols:文件很多列,如果只保留几列,可以是列名,也可以是列标[0,1]
skiprows: 读文件的时候跳过几行
df.to_csv(outname, index=False, header=False, sep='\t')
df是dataframe的一个实例
sep: 分割符
index: write rownames 默认是T
3. 修改列名
方法一:
df1.columns=['a','B','c']
方法二:
df1.rename(columns={'a':'A','b':'B'},inplace=True) #inplace 表示直接在dataframe上修改,不生成副本
4.去重
DataFrame中存在重复的行或者几行中某几列的值重复,这时候需要去掉重复行,示例如下:
data.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
result['Freq'].unique() 列去重
代码中subset对应的值是列名,表示只考虑这两列,将这两列对应值相同的行进行去重。默认值为subset=None表示考虑所有列。
keep='first'表示保留第一次出现的重复行,是默认值。keep另外两个取值为"last"和False,分别表示保留最后一次出现的重复行和去除所有重复行。
inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。
5. 遍历
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
方法一:
for index,row in df.iterrows():
print row['c1'],row['c2']
方法二:
for row in df.itertuples(index=True, name='Pandas'):
print getattr(row, "c1"), getattr(row, "c2")
itertuples()应该比iterrows()快
iterrows(): 数据的dtype可能不是按行匹配的,因为iterrows返回一个系列的每一行,它不会保留行的dtypes(dtypes跨DataFrames列保留)*
iterrows(): 不要修改行
6. 删除NaN
data.dropna(axis=0,how='all')
result.fillna(0,inplace=True) ##将nan替换成0
###将dataframe的nan或者inf替换成0
import numpy as np
feature.replace(np.nan, 0, inplace=True)
feature.replace(np.inf, 0, inplace=True)
axis: 0表示行 1 表示列
how: any表示只要有Nan,则删除包含NAN的行或列; all表示该行或列全部是NAN才删除
7. 筛选
多个条件,直接用列标筛选:
outfile = df1[df1.c1=='11']
outfile = df1[(df1['c1']=='11') & (df1['c2']=='11') &(df1['c3']=='11')]
outfile = ~df1[(df1['c1']=='11') & (df1['c2']=='11') &(df1['c3']=='11')] 删除都为11的行
利用isin来多变量删除
注意isin的参数是list
filter1 = df['c1'].isin(['11'])
filter2 = df['c2'].isin(['11'])
df[-(filter1 & filter2)]df.isin({'num_wings': [0, 3]}
某列值在某个区间
some_values = [1,2,3]
df[df['A'].isin(some_values)]
找出含有特定字符串的行
res = res[res['col'].str.contains("haha")]
求行数
len(res.index)
res.shape
多个条件筛选时,每个条件都要加括号
8.索引、抽取数据
iloc: 只能用数字来索引数据
loc: 只能用字符型的标签来索引数据,但是当数据框dataframe的行标签或者列标签为数字,loc就可以来其来索引
ix: 混合索引,整形数据索引字符型标签都可以索引,现在已不支持
选取列:
mer[['tid', 'pos', 'num_x', 'num_y', 'base_x', 'base_y']]
mer["id"]
mer.iloc[:, [0, 1, 6]]
mer.iloc[:,0]
选取行
mer.iloc[2]
9. 列间运算
df.eval('D = (A+B) / c', inplace=True) #计算得新列,并直接修改原数据
使用局部变量:
column_mean = df.mean(1)
result = df.eval('A + @column_mean')
过滤列:
result = df.query('A < @Cmean and B < @Cmean')
result['C'] = result['A']+"|"+ result['B']
给df增加一列,内容是bed
bed=[1,2,3]
df.insert(0,'bed',bed) #0表示要插入的列的位置,比如0是插入到第一列;"bed"是列名,bed是内容
两列相乘
df['C'] = df['A'].mul(df['B'])
去掉某列的固定字符串(比如将hello删掉)
df['A'] = df['A'].str.replace('hello','')
分组运算
1. 在A列的基础上对B列进行分组求和
Counts = Counts.groupby(by='A')['B'].sum()
之后Counts类型会变成
转换成DataFrame
c = pd.DataFrame({"A":Counts.index,"B":Counts.values})
2. 根据Num进行排序
ascending表示是否升序
tidTarget = tidTarget.sort_values(by=['Num'],axis=0,ascending=True)
Pandas为了解决性能问题,引入了eval()和query()函数,他们可以让用户直接运行C语言速度的操作,不需要费力的配置中间数组,它们都依赖于Numexpr程序包。
根据条件赋值
df.B[df.A>4] = 0
10.判断是否为空
if pos.empty: print ("this")
11.生成一个新dataframe,并插入一行数据
vcf = pd.DataFrame(columns = ('#CHROM','POS','ID','REF','ALT'))
vcf = vcf.append({'#CHROM':chrom,'POS':num[i],'ID':".",'REF':ref,'ALT':j},ignore_index=True)
12.转换为list
d.columns.values.tolist()
d.values[:,7].tolist()
13.检查数据类型
查看每一列的数据类型
print(df.dtypes)
需要将某列的类型变换 astype
df['TP'] = df['TP'].astype(str)
df.dtypes
14.qcut与cut
数据
from plotnine.data import mtcars
qcut保证分的区间的数据个数是一样的
cut是将值均匀分成几等份
import pandas as pd
import numpy as np
b,bins=pd.qcut(mtcars['mpg'],4,retbins=True, duplicates="drop")
b是每个值所在区间
bins返回区间
[10.4, 15.425, 19.2, 22.8, 33.9]
import pandas as pd
import numpy as np
b,bins=pd.cut(mtcars['mpg'],4,retbins=True, duplicates="drop")
bins
[10.3765, 16.275, 22.15, 28.025, 33.9]
15.merge/concat/join
merge: 合并的on 类型必须一致,on的值可以有重复
concat: 可以行或列合并
join: 根据索引合并,
import pandas as pd
import numpy as np
df1 = pd.DataFrame({"A":['a','b','c','d','d'],'B':range(0,5)})
df2 = pd.DataFrame({"A":['a','b','c','d','e'],'B':range(0,5)})
print(df1)
print(df2)
pd.merge(df1,df2,on='A',how='left')
import pandas as pd
import numpy as np
df1 = pd.DataFrame({"A":['a','b','c','d'],'B':range(0,4)})
df2 = pd.DataFrame({"A":['a','b','c','d','e'],'B':range(0,5)})
print(df1)
print(df2)
pd.concat([df1,df2],axis=1)
concat合并list,axis=1时,合并到列,axis=0,合并到行
import pandas as pd
import numpy as np
df1 = pd.DataFrame({"A":['a','b','c','d','d'],'B':range(0,5)})
df2 = pd.DataFrame({"A":['a','b','c','d','e'],'B':range(0,5)})
print(df1)
print(df2)
df1.join(df2,how='left',lsuffix='_l')
16. 求交集 差集
可以利用merge函数
indicator为mege状态的列标,内容可能为: both left_only right_only
import pandas as pd
import numpy as np
df1 = pd.DataFrame({"A":['a','b','c','d','d'],'B':range(0,5)})
df2 = pd.DataFrame({"A":['a','b','c','d','e'],'B':range(0,5)})
data = df1.merge(df2,on=['A','B'],how='outer',indicator='status')
data
df1与df2的交集
df1-df2
df2-df1
17. 排序
import pandas as pd
df1 = pd.DataFrame({"A":['a','b','c','d','d'],'B':range(0,5)})
df1.sort_values(by='B',ascending=False)
原本
排序后
18. 重置索引
需要注意的是merge/concat/join 基本都会在索引的基础上进行操作,如果有筛选等操作导致索引乱序,那么可能会有问题
drop=True: 把旧索引删除,置换为新索引
df = df.reset_index(drop=True)
19.melt 及 pivot_table
pivot_table
pd.pivot_table(df,index ='Name',values='Val',columns='City')
pandas.melt(frame,id_vars=None,value_vars=None,
var_name=None,value_name='value',col_level=None)
id_vars: 不需要被转换的列名
value_vars:需要被转换的列名
var_name: 新列 变量的列名
value_name: 新列 值的列名
可以将pivot_table的结果还原
pd.melt(df,id_vars=['Name','City'],value_vars='value')
20.根据某一列内容生成新列,map
dict1 = {'Alice':'Beta','Mallory':'Alpha','Bob':'h','Alex':'b'}
df['Name2'] = df['Name'].map(dict1)
df
结果: