数据框构建

1 读取文件

  1. import pandas as pd
  2. df = pd.read_csv('test.csv')

2 手动构建

  1. # 从字典构建
  2. df = pd.DataFrame({'name': ['luffy', 'zoro'], 'age': [18, 19] })
  3. # 从列表/数组构建
  4. df = pd.DataFrame([['luffy', 18], ['zoro', 19]], columns=['name', 'age'])
  5. # 设置header或替换header
  6. df = pd.DataFrame([['luffy', 18], ['zoro', 19]])
  7. df.set_axis(['name', 'age'], axis='columns', inplace=True)
  8. # 构建空数据框,后添加数据
  9. df = pd.DataFrame()
  10. df['name'] = ['luffy', 'zoro']
  11. df['age'] = [18, 19]

数据框截取

  1. # 获取某一列
  2. df.name
  3. # or
  4. df['name']
  5. # 获取多列, 或重新排列
  6. df[['name', 'age']]
  7. # or
  8. df.filter(items=['name', 'age'], axis=1) # or axis='columns'
  9. # 注意
  10. # - axis=0 or 'index' 按行(索引)
  11. # - axis=1 or 'columns' 按列
  12. # 获取前/后N行
  13. df.head(N)
  14. df.tail(N)

数据框连接(concat)

  1. pd.concat(df1, df2)

数据框合并(merge)

  1. df1 = pd.DataFrame({'name': ['luffy', 'zoro'], 'age': [18, 19]})
  2. df2 = pd.DataFrame({'name': ['luffy', 'sanji'], 'like': ['meat', 'beauty']})
  3. df3 = pd.DataFrame({'uid': ['luffy', 'sanji'], 'like': ['meat', 'beauty']})
  4. pd.merge(df1, df2)
  5. # or
  6. df1.merge(df2)
  7. # how: {'left', 'right', 'outer', 'inner'}
  8. df1.merge(df2, how='left') # 左连接,没有的补NaN
  9. # on: 指定合并的关键字
  10. df1.merge(df2, on='name')
  11. # left_on, right_on:当两个关键字不一致时
  12. df1.merge(df3, left_on='name', right_on='uid', how='left')

数据框过滤

df.loc

df.loc[exp] == df[exo] 多条件过滤用 & 连接,而不是 &&

  1. # 单条件过滤
  2. df[df.name == 'luffy']
  3. df.loc[df.name == 'luffy']
  4. df[df.age > 18]
  5. # 多条件过滤
  6. df[(df.name=='zoro') & (df.age > 18)]

df.filter

  1. df = pd.DataFrame({'name': ['luffy', 'zoro'], 'age': [18, 19] })
  2. # 按行的index过滤
  3. df.filter(items=[1, 3], axis=0)
  4. # 重新设置索引
  5. df1 = df.set_index('name')
  6. # items: 完全匹配
  7. df1.filter(items=['luffy'], axis='index')
  8. # like: 部分匹配
  9. df1.filter(like='ffy', axis='index')
  10. # regex: 正则匹配
  11. df1.filter(regex='ffy$', axis='index'

.isin

  1. # 使用给定的列表过滤name列
  2. name_list = ['luffy', 'nami', 'robin']
  3. df[df.name.isin(name_list)]
  4. # 组合条件
  5. df[df.name.isin(name_list) & (df.age>=18)]

.fillna

  1. # 替换NaN为指定字符
  2. df.fillna('.')

数据框header重命名

  1. df = pd.DataFrame({'name': ['luffy', 'zoro'], 'age': [18, 19] })
  2. # 使用字典映射
  3. df.rename(index=str, columns={'name': 'Name', 'age': 'Age'})
  4. # or
  5. df.rename(str, columns={'name': 'Name', 'age': 'Age'}
  6. # or
  7. df.rename(columns={'name': 'Name', 'age': 'Age'}
  8. # 使用函数
  9. df.rename(str.upper, axis='columns')

数据框每列最大宽度设置

当一列的字符长度过长时,默认会显示不完整(只是显示,并非实际)

  1. # 获取
  2. pd.get_option('max_colwidth') # default 50
  3. # or
  4. pd.options.display.max_colwidth
  5. # 设置
  6. pd.set_option('max_colwidth', 200)
  7. # or
  8. pd.options.display.max_colwidth = 200

数据框按条件转换数据

.apply

针对某一列进行

  1. url = 'http://rest.kegg.jp/list/hsa:100750326+hsa:100422907'
  2. df = pd.read_csv(url, sep='\t', names=['geneid', 'symbol'])

image.png

  1. import re
  2. df.symbol.apply(lambda x: re.split(r',|;', x, 1)[0])
  3. symbol = df.symbol.apply(lambda x: re.split(r',|;', x, 1)[0])
  4. alias = df.symbol.apply(lambda x: re.split(r',|;', x, 1)[1])
  5. df.symbol = symbol
  6. df['alias'] = alias

image.png

.applymap

针对真个数据框的每个值

  1. df.applymap(lambda x: re.split(r',|;', x, 1)[0].replace('hsa:', ''))

image.png