pandas典型应用

#header默认为0,即以第一列为列名,这里设为None,意味不设置第一行为列名;
df11 = pd.read_table(url,header =None)
df11.head()

#names =***,可以自定义设置列名
user_cols = ['id','quantity','name','choice','price']
df= pd.read_table(url,header =None,names = user_cols)
df.head()
查看行与列
df.shape#查看Dataframe的整体数据

#列出某一列的数据,为一个series数据
df['name']#也可以df.name
print(type(df['name']))

处理数据中时利用columns改变列名
#在Dataframe数据中更改列名,在每个列名后面加一个‘_’;
df.columns = [str(i)+'_' for i in df.columns]
df

利用drop函数删除特定的列
#pd.DataFrame去除某一列,用到的函数drop,
# 第一个参数为单个标签或多个标签;
# axis表示欲删除的为行或者列,0为行,1为列;
# inplace =True,以及操作
df1 =df
df1.drop(['name_','choice_'],axis = 1,inplace = True)
df1.head()


利用map函数对列中数据格式进行变换

#对某一列数据进行修改;把price_中的$变成¥;利用lambda映射;
df['price_'] = df['price_'].map(lambda x:str(x).replace('$',''))
df


 to_csv将 Dataframe数据直接写到csv文件中

#将 Dataframe写出csv文件,
# 第一个参数描述欲输出的文件名,若提供的为None,则返回的是string;
# index表示行索引,默认为True,
#   header = True表示的是不保存列名。
# encoding = 'gbk',输入编码方式为gbk
df.to_csv('E:/ceshi/ab.csv',index =False,header =True,encoding = 'gbk')


converters
可以在读取的时候对列数据进行变换:

pd.read_csv(file_path,encoding='gbk', converters={"编号": lambda x: int(x) + 10})


true_values和false_value
指定哪些值应该被清洗为True,哪些值被清洗为False。


pd.read_csv(file_path,encoding='gbk',true_values=["林克","奎托斯","褪色者","苇名弦一羊"],false_values=["马里奥"])

注意这里的替换规则,只有当某一列的数据全部出现在true_values + false_values里面,才会被替换。例如执行以下内容,不会发生变化;

skipfooter
从文件末尾过滤行,解析引擎退化为 Python。这是因为 C 解析引擎没有这个特性。

pd.read_csv(file_path,encoding='gbk',skipfooter=2,engine=“python”)
skipfooter接收整型,表示从结尾往上过滤掉指定数量的行,因为引擎退化为python,那么要手动指定engine=“python”,不然会警告。

nrows
nrows 参数设置一次性读入的文件行数,它在读入大文件时很有用,比如 16G 内存的PC无法容纳几百 G 的大文件。

pd.read_csv(file_path,encoding='gbk',nrows=4)

na_values
na_values 参数可以配置哪些值需要处理成 NaN,这个是非常常用的。

pd.read_csv(file_path,encoding='gbk',na_values=['马里奥','战神'])

我们看到将 ‘马里奥’ 和 ‘战神’ 设置成了NaN,当然我们这里不同的列,里面包含的值都是不相同的。但如果两个列中包含相同的值,而我们只想将其中一个列的值换成NaN该怎么做呢?通过字典实现只对指定的列进行替换。以下的例子可以看到,战神并没有被替换成NaN, 因为在角色里没有这个值;/

pd.read_csv(file_path,encoding='gbk',na_values={"角色":['马里奥','战神'],'编号':[2]})

17. keep_default_na
我们知道,通过 na_values 参数可以让 pandas 在读取 CSV 的时候将一些指定的值替换成空值,但除了 na_values 指定的值之外,还有一些默认的值也会在读取的时候被替换成空值,这些值有: “-1.#IND”、“1.#QNAN”、“1.#IND”、“-1.#QNAN”、“#N/A N/A”、“#N/A”、“N/A”、“NA”、“#NA”、“NULL”、“NaN”、“-NaN”、“nan”、“-nan”、“” 。尽管这些值在 CSV 中的表现形式是字符串,但是 pandas 在读取的时候会替换成空值(真正意义上的 NaN)。不过有些时候我们不希望这么做,比如有一个具有业务含义的字符串恰好就叫 “NA”,那么再将它替换成空值就不对了。

这个时候就可以将 keep_default_na 指定为 False,默认为 True,如果指定为 False,那么 pandas 在读取时就不会擅自将那些默认的值转成空值了,它们在 CSV 中长什么样,pandas 读取出来之后就还长什么样,即使单元格中啥也没有,那么得到的也是一个空字符串。但是注意,我们上面介绍的 na_values 参数则不受此影响,也就是说即便 keep_default_na 为 False,na_values 参数指定的值也依旧会被替换成空值。举个栗子,假设某个 CSV 中存在 “NULL”、“NA”、以及空字符串,那么默认情况下,它们都会被替换成空值。但 “NA” 是具有业务含义的,我们希望保留原样,而 “NULL” 和空字符串,我们还是希望 pandas 在读取的时候能够替换成空值,那么此时就可以在指定 keep_default_na 为 False 的同时,再指定 na_values 为 ["NULL", ""]


18. na_filter
是否进行空值检测,默认为 True,如果指定为 False,那么 pandas 在读取 CSV 的时候不会进行任何空值的判断和检测,所有的值都会保留原样。因此,如果你能确保一个 CSV 肯定没有空值,则不妨指定 na_filter 为 False,因为避免了空值检测,可以提高大型文件的读取速度。另外,该参数会屏蔽 keep_default_na 和 na_values,也就是说,当 na_filter 为 False 的时候,这两个参数会失效。

从效果上来说,na_filter 为 False 等价于:不指定 na_values、以及将 keep_default_na 设为 False。


19. skip_blank_lines
skip_blank_lines 默认为 True,表示过滤掉空行,如为 False 则解析为 NaN。


20. parse_dates
指定某些列为时间类型,这个参数一般搭配下面的date_parser使用。


21. date_parser
是用来配合parse_dates参数的,因为有的列虽然是日期,但没办法直接转化,需要我们指定一个解析格式:

from datetime import datetime
pd.read_csv(file_path,encoding='gbk',parse_dates=['发行日'],date_parser=lambda x:datetime.strptime(x,'%Y/%m/%d'))




22. infer_datetime_format
infer_datetime_format 参数默认为 False。如果设定为 True 并且 parse_dates 可用,那么 pandas 将尝试转换为日期类型,如果可以转换,转换方法并解析,在某些情况下会快 5~10 倍。
23.iterator
iterator 为 bool类型,默认为False。如果为True,那么返回一个 TextFileReader 对象,以便逐块处理文件。这个在文件很大、内存无法容纳所有数据文件时,可以分批读入,依次处理。
df=pd.read_csv(file_path,encoding='gbk',iterator=True)
display(df.get_chunk(2))

"""
    编号    角色    源于    发行日
0    1    马里奥    超级马里奥:奥德赛    2017/10/27
1    2    林克    塞尔达传说:荒野之息    2017/3/3
"""

print(chunk.get_chunk(1))
"""
编号    角色    源于    发行日
2    3    奎托斯    战神    2018/4/20
"""

# 文件还剩下三行,但是我们指定读取10,那么也不会报错,不够指定的行数,那么有多少返回多少
print(chunk.get_chunk(10))
"""
编号    角色    源于    发行日
3    4    褪色者    埃尔登法环    2022/2/25
4    5    苇名弦一羊    只狼    2019/3/22
"""

try:
    # 但是在读取完毕之后,再读的话就会报错了
    chunk.get_chunk(5)
except StopIteration as e:
    print("读取完毕")
# 读取完毕    

24. chunksize
chunksize 整型,默认为 None,设置文件块的大小。
chunk = pd.read_csv(file_path, sep="\t", chunksize=2)
# 还是返回一个类似于迭代器的对象
# 调用get_chunk,如果不指定行数,那么就是默认的chunksize
print(chunk.get_chunk())
"""
编号    角色    源于    发行日
0    1    马里奥    超级马里奥:奥德赛    2017/10/27
1    2    林克    塞尔达传说:荒野之息    2017/3/3
"""

# 但也可以指定
print(chunk.get_chunk(100))
"""
编号    角色    源于    发行日
2    3    奎托斯    战神    2018/4/20
3    4    褪色者    埃尔登法环    2022/2/25
4    5    苇名弦一羊    只狼    2019/3/22
"""

try:
    chunk.get_chunk(5)
except StopIteration as e:
    print("读取完毕")
# 读取完毕    

25. compression
compression 参数取值为 {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None},默认 ‘infer’,这个参数直接支持我们使用磁盘上的压缩文件。

# 直接将上面的.csv添加到压缩文件,打包成game_data.zip
pd.read_csv('game_data.zip', compression="zip",encoding='gbk')
1
2
26. thousands
千分位分割符,如 , 或者 .,默认为None。

27. encoding
encoding 指定字符集类型,通常指定为 ‘utf-8’。根据情况也可能是’ISO-8859-1’,本文中所有的encoding='gbk' ,主要原因为:我的数据是用Excel 保存成.CSV的,默认的编码格式为GBK;

28. error_bad_lines和warn_bad_lines
如果一行包含过多的列,假设csv的数据有5列,但是某一行却有6个数据,显然数据有问题。那么默认情况下不会返回DataFrame,而是会报错。

我们在某一行中多加了一个数据,结果显示错误。因为girl.csv里面有5列,但是有一行却有6个数据,所以报错。

在小样本读取时,这个错误很快就能发现。但是如果样本比较大、并且由于数据集不可能那么干净,会很容易出现这种情况,那么该怎么办呢?而且这种情况下,Excel基本上是打不开这么大的文件的。这个时候我们就可以将error_bad_lines设置为False(默认为True),意思是遇到这种情况,直接把这一行给我扔掉。同时会设置 warn_bad_lines 设置为True,打印剔除的这行。


pd.read_csv(file_path,encoding='gbk',error_bad_lines=False, warn_bad_lines=True)

 

posted @ 2024-01-14 10:05  myrj  阅读(13)  评论(0编辑  收藏  举报