python数据分析进阶

python学习笔记


文章目录

  • python学习笔记
  • 前言
  • pandas 入门
    • [2/100]pandas 数据读取
    • pandas 的数据结构
      • Series
        • 仅有数据列表即可产生简单的Series
        • 在创建Series时指定索引
        • 使用字典创建Series
        • 根据标签索引查询数据
      • dataframe
        • dataframe 查询
    • [2/100]pandas 数据查询
      • 使用df.loc进行数据查询
        • 读取数据
        • 查询单个值
        • 使用值列表进行查询
        • 使用数值区间进行范围查询
        • 使用iloc数字索引进行查询
        • 使用条件表达式进行查询
        • 调用函数查询
    • [3/100]pandas 新增数据列
      • 读取数据
      • 直接赋值
      • df.apply方法
        • 查看un的计数
      • df.assign方法
      • 按条件选择分组分别赋值


前言

#生信100天打卡系列


pandas 入门

[2/100]pandas 数据读取

  1. pd.read_csv(path, sep = “\t”, header = None, names = [‘pdate’, ‘pv’, ‘uv’])
  2. pd.read_excel
  3. pd.read_sql
import pandas as pd
import numpy as np
name = pd.read_csv("../name_id.xls", sep = "\t", names = ['sample', 'subpopulation'])
name

pandas 的数据结构

  • dataframe --> 二维数据、整个表格、 多行多列
  • series --> 一维数据、一行一列(类似于字典, 比较好处理)
    • series 由一组数据(不同的数据类型)以及与之相关索引构成

Series

仅有数据列表即可产生简单的Series

s1 = pd.Series([1, 'a', 5.2, 7])
s1
0      1
1      a
2    5.2
3      7
dtype: object
s1.index
RangeIndex(start=0, stop=4, step=1)
s1.values
array([1, 'a', 5.2, 7], dtype=object)

在创建Series时指定索引

s2 = pd.Series([1, 'a', 5.2, 7], index = ['a', 'b', 'd', 'e'])
s2
a      1
b      a
d    5.2
e      7
dtype: object

使用字典创建Series

  • 字典的keys为索引, values为值
sdata = {'Ohio' : 35000, 'Texas' : 72000, 'Oregon' : 16000, 'Utah' : 5000}
s3 = pd.Series(sdata)
s3
Ohio      35000
Texas     72000
Oregon    16000
Utah       5000
dtype: int64

根据标签索引查询数据

  • 类似字典dict
  • 查询一个值, 返回的是这个值本身
  • 同时查询多个值, 返回的是一个Series
s2
a      1
b      a
d    5.2
e      7
dtype: object
s2['a']
1
type(s2['a'])
int
s2[['b', 'a']]
b    a
a    1
dtype: object
type(s2[['b', 'a']])
pandas.core.series.Series

dataframe

  • 每列可以是不同的类型
  • 既有行索引index, 也有列索引columns
  • 也可以被看做是由Series组成的字典
# 根据多个字典序列创建dataframe
data = {
    'state' : ['Ohio', 'Utah', 'Ohio', 'Texas', 'Ohio'],
    'year' : [2000, 2001, 2002, 2003, 2004],
    'pop' : [1.5, 1.7, 3.6, 2.4, 2.9]
}
df = pd.DataFrame(data)
df
state year pop
0 Ohio 2000 1.5
1 Utah 2001 1.7
2 Ohio 2002 3.6
3 Texas 2003 2.4
4 Ohio 2004 2.9

dataframe 查询

  • 查询一行, 结果是一个Series
  • 查询多行, 结果是一个Dataframe
# 查询一行
df.loc[1]
state    Utah
year     2001
pop       1.7
Name: 1, dtype: object
# 查询多行
df.loc[1:3]
state year pop
1 Utah 2001 1.7
2 Ohio 2002 3.6
3 Texas 2003 2.4
type(df.loc[1:3])
pandas.core.frame.DataFrame

[2/100]pandas 数据查询

  1. df.loc , 根据行、列的标签值查询
  2. df.iloc , 根据行、列的数字位置查询
  3. df.where
  4. df.query
  • .loc 既能查询, 又能覆盖写入

使用df.loc进行数据查询

  • 使用单个label值进行查询
  • 使用值列表批量查询
  • 使用数值区间进行范围查询
  • 使用条件表达式查询
  • 调用函数查询

读取数据

na = pd.read_table("../name_id.xls", header = None, names = ['samples', 'subpopulation'])
na
samples subpopulation
0 110 CA
1 111 CA
2 113 CA
3 117 CA
119 MPSM10 MP
120 MPSM11 MP
121 MPSM12 MP
122 MPSM13 MP
155 553 WA
156 660 WA
157 855 WA
250 P14 OG
251 P28 OG
# 设定索引为samples
na.set_index('samples', inplace = True)
na.index
Index(['110', '111', '113', '117', '120', '124', '128', '129', '130', '142',
       ...
       'P64', 'P65', 'P67', 'P70', 'P7', 'P81', 'P84', 'P8', 'P14', 'P28'],
      dtype='object', name='samples', length=252)
na
# 将subpopulation列中的CA替换为test
na.loc[:, "subpopulation"] = na["subpopulation"].str.replace("CA", "test").astype('str')
na.head()
subpopulation
samples
110 test
111 test
113 test
117 test
120 test

查询单个值

na

使用值列表进行查询

na.loc[['110', '117'], 'subpopulation']
samples
110    CA
117    CA
Name: subpopulation, dtype: object

使用数值区间进行范围查询

na.loc['110':'117', 'subpopulation']
samples
110    CA
111    CA
113    CA
117    CA
Name: subpopulation, dtype: object

使用iloc数字索引进行查询

na.iloc[1:20, 0]
samples
111    CA
113    CA
117    CA
120    CA
124    CA
128    CA
129    CA
130    CA
142    CA
143    CA
147    CA
153    CA
161    CA
162    CA
170    CA
171    CA
172    CA
188    CA
194    CA
Name: subpopulation, dtype: object

使用条件表达式进行查询

na[na.loc[:,'subpopulation'] == 'CA']

调用函数查询

na.loc[lambda na : (na['subpopulation'] == "CA") | (na['subpopulation'] == "OG"), :]
subpopulation
samples
110 CA
111 CA
P14 OG
P28 OG

[3/100]pandas 新增数据列

  1. 直接赋值
  2. df.apply
  3. df.assign
  4. 按条件选择分组分别赋值
import numpy as np
import pandas as pd

读取数据

df = pd.read_table('../name_id.xls', sep = '\t', header = None, names = ['samples', 'subpopulation'])
df.head()
samples subpopulation
0 110 CA
1 111 CA
2 113 CA
3 117 CA
4 120 CA
df.set_index('samples', inplace = True)
df.head()
subpopulation
samples
110 CA
111 CA
113 CA
117 CA
120 CA

直接赋值

df.loc[:, 'order'] = [int(i) for i in range(1,253)]
df
subpopulation order
samples
110 CA 1
111 CA 2
113 CA 3
117 CA 4
120 CA 5
... ... ...
P81 WA 248
P84 WA 249
P8 WA 250
P14 OG 251
P28 OG 252

252 rows × 2 columns

df.apply方法

  • Apply a function along an axis of the DataFrame
  • Objects passed to the function are Series objects whose index is either the DataFrame’s index(axis=0)
  • or the DataFrame’s columns(axis = 1)
  • 实例:添加一列中文注释:
    1. 如果为CA,则注释为栽培薄皮
    2. 如果为WA,则注释为野生薄皮
    3. 如果为MP,则注释为马泡
    4. 如果为OG,则注释为外群
def add_column(x):
    if x['subpopulation'] == 'CA':
        return "栽培薄皮"
    elif x['subpopulation'] == 'WA':
        return "野生薄皮"
    elif x['subpopulation'] == 'MP':
        return "马泡"
    else:
        return "外群"
df.loc[:, 'un'] = df.apply(add_column, axis = 1)
df
subpopulation order un
samples
110 CA 1 栽培薄皮
111 CA 2 栽培薄皮
113 CA 3 栽培薄皮
117 CA 4 栽培薄皮
120 CA 5 栽培薄皮
... ... ... ...
P81 WA 248 野生薄皮
P84 WA 249 野生薄皮
P8 WA 250 野生薄皮
P14 OG 251 外群
P28 OG 252 外群

252 rows × 3 columns

查看un的计数

  • df[‘un’].value_counts()
df['un'].value_counts()
栽培薄皮    119
野生薄皮     95
马泡       36
外群        2
Name: un, dtype: int64

df.assign方法

  • Assign new columns to a Dataframe
  • Return a new object with all original columns in addition to new ones.
  • 不会修改Dataframe本身,返回的是一个新的对象
# 可以同时新增多个列
df.assign(
    sort = lambda x : x['order'],
    sort1 = lambda x : x['order'] * 2
)
subpopulation order un sort sort1
samples
110 CA 1 栽培薄皮 1 2
111 CA 2 栽培薄皮 2 4
113 CA 3 栽培薄皮 3 6
117 CA 4 栽培薄皮 4 8
120 CA 5 栽培薄皮 5 10
... ... ... ... ... ...
P81 WA 248 野生薄皮 248 496
P84 WA 249 野生薄皮 249 498
P8 WA 250 野生薄皮 250 500
P14 OG 251 外群 251 502
P28 OG 252 外群 252 504

252 rows × 5 columns

按条件选择分组分别赋值

  • 按条件优先选择数据,然后对这部分数据赋值新列
# 创建一个空列(一种创建新列的方法)
# 用到了broadcast机制
df['priority'] = ''
df.loc[df['order'] <= 30, 'priority'] = "第一组"
df.loc[df['order'] > 30, 'priority'] = "第二组"
df
subpopulation order un priority
samples
110 CA 1 栽培薄皮 第一组
111 CA 2 栽培薄皮 第一组
113 CA 3 栽培薄皮 第一组
117 CA 4 栽培薄皮 第一组
120 CA 5 栽培薄皮 第一组
... ... ... ... ...
P81 WA 248 野生薄皮 第二组
P84 WA 249 野生薄皮 第二组
P8 WA 250 野生薄皮 第二组
P14 OG 251 外群 第二组
P28 OG 252 外群 第二组

252 rows × 4 columns

df['priority'].value_counts()
第二组    222
第一组     30
Name: priority, dtype: int64

你可能感兴趣的:(生物信息,python,数据分析,pandas)