python包Pandas----常用操作

由于本人记性不好,每次使用都需要重新查询,因此自己总结一些常用方法,方便后续快速查阅

官网参考: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

结果:

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_42670653

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值