Pandas常用方法总结

Pandas

设置显示格式
pd.set_option('max_columns', 10)
pd.options.display.max_columns = 15  # print可以显示最多15列
pd.set_option('max_rows', 20)
pd.set_option('display.float_format', lambda x: '%.4f' % x) # 禁用科学计数法,显示小数点后4位
写文件:
df.to_csv(path,sep='\t', index=False)
df['id'].to_csv(path,  header=False, index=False)
读取多个sheet的Excel文件
data = pd.read_excel(path, header=2, sheet_name=None)
print(type(data), data.keys())
# 输出:<class 'collections.OrderedDict'>  odict_keys(['Sheet1',Sheet2','Sheet3'])

数据类型转换

python下DataFrame, Series, ndarray, list, dict, tuple的相互转换


########### Series ###########
Series <--> DataFrame
*dataframe* = pd.DataFrame({"XXX1":*series1*,"XXX2":*series2*})
*series* = *dataframe*[0]  #无标签时
*series* = *dataframe*["XXX"]  #有标签时

Serise <--> ndarray
*series* = pd.Series(*ndarray*) #这里的ndarray是1维的
*ndarray* = np.array(*series*)
*ndarray* = *series*.values

Series <--> list
*series* = pd.Series(*list*)
*list* = *series*.tolist()
*list* = list(*series*)

Series <--> dict
*series* = pd.Series(*dict*)
*dict* = *series*.to_dict()

########### DataFrame ###########
DataFrame <--> ndarray
*ndarray* = *dataframe*.values
*dataframe* = pd.DataFrame(*ndarray*)

DataFrame <--> list
*list* = *dataframe*.values.tolist()
*dataframe* = pd.DataFrame(*list*)

DataFrame <--> dict
*dataframe* = pd.DataFrame.from_dict({0:*dict1*, 1:*dict2*})
*dataframe* = pd.DataFrame(*dict*)
*dict* = *dataframe*.to_dict()

########### 其它 list ###########
dict --> list
*list* = *dict*.values() # list of values
*list* = *dict*.keys() # list of keys
*list* = list(*dict*) # list of keys

ndarray <--> list
*list* = *ndarray*.tolist()
*ndarray* = np.array(*list*)

tuple <--> list
*list* = list(*tuple*)
*tuple* = tuple(*list*)

Index --> list
*dataframe*.columns.tolist()
Pandas处理文本字符串

Pandas处理文本字符串
利用.str把Series转成string进行string形式的各种处理,包括split和正则匹配等!

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower()

idx = pd.Index([' jack', 'jill ', ' jesse ', 'frank'])
idx.str.strip()

df = pd.DataFrame(np.random.randn(3, 2), columns=[' Column A ', ' Column B '], index=range(3))
df.columns.str.strip()

s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])
s2.str.split('_')
s2.str.split('_', expand=True)  # 使用expand方法可以轻易地将这种返回展开为一个数据表.
s2.str.rsplit('_', expand=True, n=1)    # rsplit与split相似,不同的是,这个切分的方向是反的。即,从字串的尾端向首段切分. n=1限制拆分次数

s3 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca',  '' , np.nan, 'CABA', 'dog', 'cat']) 
s3.str.replace('^.a|dog', 'XX-XX ', case=False)     #replace 方法默认使用 正则表达式

s = pd.Series(['a', 'b', 'c', 'd'])
s.str.cat(sep=',')    # 序列或索引的内容可以进行拼接
定制Excel单元格格式
# 注意:先安装xlsxwriter模块!!!无需导入
writer = pd.ExcelWriter(path1)
cur_ctt = pd.DataFrame(path2)
cur_ctt.to_excel(writer, index=False, sheet_name='Sheet1')
# 在此定制单元格格式
workbook = writer.book
format1 = workbook.add_format({'align': 'center', 'valign': 'vcenter'})  # 设置居中显示,此外还可设置颜色字体等
worksheet = writer.sheets['Sheet1']
worksheet.set_column("A:P", width=16, cell_format=format1)  # 设置单元格宽度,样式
writer.save()
writer.close()

设置数据类型
df = pd.read_csv(csv, header=7, dtype='str')
定制每一列的数据类型
dtype_dic= {'subject_id': str, 'subject_number' : 'float'}
df = pd.read_csv(yourdata, dtype = dtype_dic)

Dataframe

创建Dataframe

# 使用【字典类】数据创建
data = {'水果':['苹果','梨','草莓'], '数量':[3,2,5], '价格':[10,9,8]}      # dic的值必须是list!
df = DataFrame(data)
# 或从文件读取
df = pd.read_table('path')
df = pd.read_csv('path')
# 也可直接初始化一个空Dataframe
df = pd.DataFrame()
# 创建带行列名的空Dataframe
df = pd.DataFrame(columns=list_like, index=list_like2)

属性获取

获取shape
df.shape
获取总行数
len(df)
len(df.index) 
df.shape[0]
获取总列数
len(df.columns)
df.shape[1]

空值处理

判断空字符串

dataframe去空字符串处理
Python数据分析中对重复值、缺失值、空格的处理
python pandas消除空值和空格以及 Nan数据替换
如果只有一个空格,无需使用以上方法,导入数据的时候直接设置Na值即可:

df = pd.read_table('data_in_gene.txt', na_values=' ', keep_default_na=True)
判断空值:

数据处理中判断空值的方法(np.isnan、is np.nan和pd.isna)比较

  • np.isnan(只有数组数值运算时可使用)
  • is np.nan(不建议使用)
  • pd.isna(大部分数据处理的场合推荐使用)

如果我们的空值既会出现np.nan,也会出现math.nan,甚至还会出现None,或者要判断的数据值既可能是数值型也可能是字符串(符合大部分场景的实际情况),墙裂推荐使用pd.isna

去除空值:
# 去掉带有空值的行,axis=0:去除行;any:只要有空值就去掉整行,subset:指定要寻找空值的列
fst_mht = fst_mht.dropna(axis=0, how='any', subset=['UCSC_REFGENE_NAME']) 
空值填充:
df = df.fillna(value={'a':0.5,'b':0,'c':0.3})
df = df.fillna(method='ffill')  # 用上一个非空值填充下一个

遍历Dataframe:

原文链接
iterrows(): 按行遍历,将DataFrame的每一行迭代为(index, Series)对,可以通过row[name]对元素进行访问。
itertuples(): 按行遍历,将DataFrame的每一行迭代为namedtuples(pandas自定义的对象,不是python-元组),可以通过getattr(row, ‘col1’)对元素进行访问,比iterrows()效率高(PS:亲测快了无数倍)。
iteritems():按列遍历,将DataFrame的每一列迭代为(列名, Series)对,可以通过row[index]对元素进行访问。

for index, row in df.iterrows(): print(index) # 输出每行的索引值
# 对于每一行,通过列名name访问对应的元素 for row in df.iterrows(): print(row['c1'], row['c2']) # 输出每一行
for index, row in df.iteritems(): print(index) # 输出列名
for row in df.iteritems(): print(row[0], row[1], row[2]) # 输出各列
for row in df.itertuples(): print(getattr(row, 'col1'))

数据提取

参考资料:
pandas dataframe数据提取的方法
Pandas 中根据列值,选取DataFrame数据,并获取行索引号列表
总结:取单值用df.at() df.iat(),快;loc、iloc可以取多行、多列,没有at快

pandas + 正则表达式

# 取a列
df['a']
# 取a、b列
df[['a','b']]
# ix可以用数字索引,也可以用index和column索引【但是已被取代,不推荐使用】

# loc只能通过index和columns来取,不能用数字【支持切片,前后数都会包括,单值提取完是Series,多值提取完是DataFrame】
f = df.loc['one','a']   #one行,a列
df.loc['one':'two','a']#one到two行,a列
df.loc['one':'two','a':'c']#one到two行,a到c列
df.loc['one':'two',['a','c']]#one到two行,ac列

# 选取等于某个值的行记录 用 == 
df.loc[df['column_name'] == some_value] # 此处返回DataFrame
# 选取某列是否是某一类型的数值 用 isin
df.loc[df['column_name'].isin(some_values)]
# 多种条件的选取 用 &,注意加括号
df.loc[(df['column'] == some_value) & df['other_column'].isin(some_values)]
# 选取不等于某些值的行记录 用 !=
df.loc[df['column_name'] != some_value]
# isin返回一系列的数值,如果要选择不符合这个条件的数值使用~
df.loc[~df['column_name'].isin(some_values)]


#iloc只能用数字索引,不能用索引名【支持切片,单值提取完是Series,多值提取完是DataFrame】
### 注意!这个坑爹函数!取行是按实际行数取的,不是按index取的!!!
## 举例:index为0,3,5,则实际行为0,1,2,df.iloc[[3,5]]会报错!!!!
df.iloc[0]#第0行,提取完是Series
df.iloc[0:2,0:2]#0、1行,0、1列
df.iloc[[0,2],[1,2,3]]#第0、2行,1、2、3列


#iat取某个单值,只能数字索引
df.iat[1,1]#第1行,1列
#at取某个单值,只能index和columns索引
df.at['one','a']#one行,a列


# pandas + 正则表达式
def filter_by_type(df):    
    filtered_df = df[df['INFO'].str.contains('nonsynonymous|stopgain|stoploss|nonframeshift') == True]    
return filtered_df
获取列名

原文链接

  1. print([column for column in data])
  2. df.columns.values 返回numpy型的array
  3. list(df)
  4. df.columns 返回Index,通过tolist(), 或者list(array)转换为list

数据修改

数值修改

用数据提取的方法在后面直接赋值即可,经测试,df.loc和df.at可以运行。避免使用df[col][index]=xxx直接修改,因为这是链式修改,速度慢且报错。
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#indexing-view-versus-copy
https://blog.csdn.net/qq_42711381/article/details/90451301

数值格式化
# 保留n位小数
df = df.round(8)
df.round({'dogs': 1, 'cats': 0})
数值类型转换

参考资料

# 使用astype改变列中的值的类型,注意前面要有np
df['列名'] = df['列名'].astype(np.int64)

数据删除

官方文档
参数总结:
labels : single label or list-like
Index or column labels to drop.
axis : {0 or ‘index’, 1 or ‘columns’}, default 0
index : single label or list-like
Alternative to specifying axis (labels, axis=0 is equivalent to index=labels). # 使用此参数指定要删除的index即意味着axis=0,无需指定axis
columns : 同上
level : int or level name, optional
For MultiIndex, level from which the labels will be removed. # 如果有多级标签可以选择删除的级别
inplace : bool, default FalseIf True, do operation inplace and return None. # 注意,如果开启则直接修改原df
errors : {‘ignore’, ‘raise’}, default ‘raise’
If ‘ignore’, suppress error and only existing labels are dropped.

# 去掉曼哈顿图不需要的列
fst_mht = fst.drop(['BIN_END', 'N_VARIANTS', 'WEIGHTED_FST'], axis=1)
插入列:
fst = fst.insert(0, 'ID', fst_id)   # 参数:位置,列名,数据
数据合并concat:
# 简单的行合并和列合并操作。参数如下
pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
# join默认为”outer”,即如果列名不一致,用NaN填充;"inner"代表取交集,axis=1代表对列进行操作,横向合并
df3= pd.concat([df1, df2, df3], axis=1, join='inner')
合并行:
# 简单的合并行,常用来追加行。参数如下
DataFrame.append(self, other, ignore_index=False, verify_integrity=False, sort=None)
# 例子
df3 = df2.append(df1, ignore_index=True)
合并列:
# 简单的合并列。参数如下:
DataFrame.join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
数据合并merge:
# 数据库模式的数据合并操作,功能多。参数如下:
DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)

行列重排:

# 按曼哈顿图标准对剩余列进行排序
fst_mht = fst_mht.reindex(['ID', 'CHROM', 'BIN_START', 'MEAN_FST'], axis=1)
设置列名
df.columns = ['A', 'B']
设置行名(index):
data.index = ['A','B','C']
 # 默认drop=True,从原数据中删掉用作index的列
fst_mht = fst_mht.set_index('id', drop=True) 
修改行列名:
xp_mht = xp_mht.rename(columns={"chrom": "chr", "start": "pos", "xpclr_norm": "xpclr"})
df.rename(index={'a':'aa','b':'bb'},inplace=True)
按列的数值排序:
df.sort_values(['pos'])
删除DataFrame:
del df

Series

剔除数据:
fst.drop(listlike, inplace=True)     # inplace=True:直接改变原数据
从dataframe创建series
ts = pd.Series(df['Value'].values, index=df['Date'])
遍历Series:
# 只有iteritems和items两个方法,这两个方法是等价的,返回index、value对
s = pd.Series(['A', 'B', 'C'])
for index, value in s.items():
    print(f"Index : {index}, Value : {value}")
# 输出:
"""
Index : 0, Value : A
Index : 1, Value : B
Index : 2, Value : C
"""
从Series创建Dataframe(分割)
df2 = df['NORMAL'].str.split(':', expand=True)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值