python数据处理(pandas)

本文介绍了如何使用Pandas库处理CSV格式的数据,包括读取文件、数据类型检查、列名和索引操作,以及基本的数据筛选、排序、访问和创建新列的方法,展示了Pandas在数据处理中的应用和numpy的关联操作.
摘要由CSDN通过智能技术生成
# 新的数据格式,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)
序号姓名性别语文数学英语物理化学生物
01渠敬辉806030403060
12韩辉909575758085
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]
序号姓名性别语文数学英语物理化学生物
12韩辉909575758085
34石天洋909095807580
df[df.数学 < 80]
序号姓名性别语文数学英语物理化学生物
01渠敬辉806030403060
45张三606060606060
67王五707070707070
# 复杂筛选
df[(df.语文 > 80) & (df.数学 > 80) & (df.英语 > 80)]
序号姓名性别语文数学英语物理化学生物
34石天洋909095807580

排序

df.sort_values(['数学','语文','英语']).head()
序号姓名性别语文数学英语物理化学生物
45张三606060606060
01渠敬辉806030403060
67王五707070707070
56李四808080808080
23韩文晴958085608090

访问

# 按照索引去定位
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
英语数学姓名
one9064wong
two7878li
three8945sun
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]
序号姓名性别语文数学英语物理化学生物
01渠敬辉806030403060
12韩辉909575758085
23韩文晴958085608090
# 当索引为数字索引的时候,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]
序号姓名性别语文数学英语物理化学生物
01渠敬辉806030403060
12韩辉909575758085
# 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
数学语文
06080
19590
28095
39090
46060
new * 2
数学语文
0120160
1190180
2160190
3180180
4120120

重点

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

df['数学分类'] = df.数学.map(func)
df.head()
序号姓名性别语文数学英语物理化学生物数学分类
01渠敬辉806030403060及格
12韩辉909575758085优秀
23韩文晴958085608090优秀
34石天洋909095807580优秀
45张三606060606060及格
# applymap对dataframe中所有的数据进行操作的一个函数,非常重要
def func(number):
    return number + 10
# 等价
func = lambda number : number + 10

df.applymap(lambda x : str(x) + ' - ').head(2)
序号姓名性别语文数学英语物理化学生物数学分类
01 -渠敬辉 -男 -80 -60 -30 -40 -30 -60 -及格 -
12 -韩辉 -男 -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
56李四808080808080优秀160
67王五707070707070140

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

  • 34
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

和安韩Pro

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

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

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

打赏作者

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

抵扣说明:

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

余额充值