个人技术分享

# 新的数据格式,csv
  • 纯文本,使用某个字符集,比如都是ASCII、Unicode、EBCDIC或GB2312(简体中文环境)等;
  • 由记录组成(典型的是每行一条记录)
  • 每条记录被分隔符(英语:Delimiter)分隔为字段(英语:Field(computer science))(典型分隔符号有逗号、分号或制表符;有时分隔符可以包括可选的空格)
  • 每条记录都有同样的字段序列
import pandas as pd 
import numpy as np
abs_path = r'F:\Python\learn\python附件\pythonCsv\data.csv'
df = pd.read_csv(abs_path,encoding='gbk')
df.head(2)
序号 姓名 性别 语文 数学 英语 物理 化学 生物
0 1 渠敬辉 80 60 30 40 30 60
1 2 韩辉 90 95 75 75 80 85
type(df)
pandas.core.frame.DataFrame

DataFrame

# 列名
print(df.columns)
# 索引
print(df.index)
Index(['序号', '姓名', '性别', '语文', '数学', '英语', '物理', '化学', '生物'], dtype='object')
RangeIndex(start=0, stop=7, step=1)
df.loc[0]
序号      1
姓名    渠敬辉
性别      男
语文     80
数学     60
英语     30
物理     40
化学     30
生物     60
Name: 0, dtype: object
a = np.array(range(10))
a > 3
array([False, False, False, False,  True,  True,  True,  True,  True,
        True])
# 筛选数学成绩大于80
df[df.数学 > 80]
序号 姓名 性别 语文 数学 英语 物理 化学 生物
1 2 韩辉 90 95 75 75 80 85
3 4 石天洋 90 90 95 80 75 80
df[df.数学 < 80]
序号 姓名 性别 语文 数学 英语 物理 化学 生物
0 1 渠敬辉 80 60 30 40 30 60
4 5 张三 60 60 60 60 60 60
6 7 王五 70 70 70 70 70 70
# 复杂筛选
df[(df.语文 > 80) & (df.数学 > 80) & (df.英语 > 80)]
序号 姓名 性别 语文 数学 英语 物理 化学 生物
3 4 石天洋 90 90 95 80 75 80

排序

df.sort_values(['数学','语文','英语']).head()
序号 姓名 性别 语文 数学 英语 物理 化学 生物
4 5 张三 60 60 60 60 60 60
0 1 渠敬辉 80 60 30 40 30 60
6 7 王五 70 70 70 70 70 70
5 6 李四 80 80 80 80 80 80
2 3 韩文晴 95 80 85 60 80 90

访问

# 按照索引去定位
df.loc[3]
序号      4
姓名    石天洋
性别      男
语文     90
数学     90
英语     95
物理     80
化学     75
生物     80
Name: 3, dtype: object

索引

scores = {
    '英语':[90,78,89],
    '数学':[64,78,45],
    '姓名':['wong','li','sun']
}
df = pd.DataFrame(scores,index=['one','two','three'])
df
英语 数学 姓名
one 90 64 wong
two 78 78 li
three 89 45 sun
df.index
Index(['one', 'two', 'three'], dtype='object')
# 因为此时不存在数字索引,所以不能通过数字索引去访问
# df.loc[1]
df.loc['one']
英语      90
数学      64
姓名    wong
Name: one, dtype: object
# 实实在在的所谓的第几行
df.iloc[0]
英语      90
数学      64
姓名    wong
Name: one, dtype: object
# 合并了loc和iloc的功能,新版本下ix方法已被弃用
df.ix[0]
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-22-413c174d3cd1> in <module>
      1 # 合并了loc和iloc的功能
----> 2 df.ix[0]


G:\Anaconda\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   5272             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5273                 return self[name]
-> 5274             return object.__getattribute__(self, name)
   5275 
   5276     def __setattr__(self, name: str, value) -> None:


AttributeError: 'DataFrame' object has no attribute 'ix'
df.loc[:2]
序号 姓名 性别 语文 数学 英语 物理 化学 生物
0 1 渠敬辉 80 60 30 40 30 60
1 2 韩辉 90 95 75 75 80 85
2 3 韩文晴 95 80 85 60 80 90
# 当索引为数字索引的时候,ix和loc是等价的,新版本下ix方法已被弃用
df.ix[:2]
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-33-a97de2692f80> in <module>
      1 #当索引为数字索引的时候,ix和loc是等价的
----> 2 df.ix[:2]


G:\Anaconda\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   5272             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5273                 return self[name]
-> 5274             return object.__getattribute__(self, name)
   5275 
   5276     def __setattr__(self, name: str, value) -> None:


AttributeError: 'DataFrame' object has no attribute 'ix'
# 访问某一行,是错误的
# df[0]

# 访问多行数据是可以使用切片的
df[:2]
序号 姓名 性别 语文 数学 英语 物理 化学 生物
0 1 渠敬辉 80 60 30 40 30 60
1 2 韩辉 90 95 75 75 80 85
# dataframe中的数组
df.数学.values
array([60, 95, 80, 90, 60, 80, 70], dtype=int64)
# 简单的统计
df.数学.value_counts()
60    2
80    2
95    1
70    1
90    1
Name: 数学, dtype: int64
# 提取多列
new = df[['数学','语文']].head()
new
数学 语文
0 60 80
1 95 90
2 80 95
3 90 90
4 60 60
new * 2
数学 语文
0 120 160
1 190 180
2 160 190
3 180 180
4 120 120

重点

def func(score):
    if score>=80:
        return '优秀'
    elif score>=70:
        return '良'
    elif score>=60:
        return '及格'
    else:
        return '不及格'
    pass

df['数学分类'] = df.数学.map(func)
df.head()
序号 姓名 性别 语文 数学 英语 物理 化学 生物 数学分类
0 1 渠敬辉 80 60 30 40 30 60 及格
1 2 韩辉 90 95 75 75 80 85 优秀
2 3 韩文晴 95 80 85 60 80 90 优秀
3 4 石天洋 90 90 95 80 75 80 优秀
4 5 张三 60 60 60 60 60 60 及格
# applymap对dataframe中所有的数据进行操作的一个函数,非常重要
def func(number):
    return number + 10
# 等价
func = lambda number : number + 10

df.applymap(lambda x : str(x) + ' - ').head(2)
序号 姓名 性别 语文 数学 英语 物理 化学 生物 数学分类
0 1 - 渠敬辉 - 男 - 80 - 60 - 30 - 40 - 30 - 60 - 及格 -
1 2 - 韩辉 - 男 - 90 - 95 - 75 - 75 - 80 - 85 - 优秀 -

匿名函数

# 列表推导式
[i+100 for i in range(10)]
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
def func(x):
    return x + 100
list(map(func,range(10)))
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
# 匿名函数的使用条件:
# 1.函数就一行
# 2.函数不经常使用
# 3.函数没有必要取名字
list(map(lambda x : x+100,range(10)))
[100, 101, 102, 103, 104, 105, 106, 107, 108, 109]
# apply根据多列生成新的一个列的操作,用apply
df['new_score'] = df.apply(lambda x : x.数学 + x.语文, axis=1)
# 前几行
df.head(2)
# 最后几行
df.tail(2)
序号 姓名 性别 语文 数学 英语 物理 化学 生物 数学分类 new_score
5 6 李四 80 80 80 80 80 80 优秀 160
6 7 王五 70 70 70 70 70 70 140

panda中的dataframe的操作,很大一部分跟numpy中的二位数组的操作是近似的