Pandas之DataFrame,快速入门,迅速掌握(三)

简介: Pandas之DataFrame,快速入门,迅速掌握(三)

Pandas之DataFrame,快速入门,迅速掌握(二)https://developer.aliyun.com/article/1496716

五、合并 merge、join

Pandas具有全功能的,高性能内存中连接操作,与SQL等关系数据库非常相似

pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=(‘_x’, ‘_y’), copy=True, indicator=False) copy=True表示复制一个,False表示原值替换,修改原数据

1.merge合并 → 类似excel的vlookup

df1 = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’, ‘K3’],
‘A’: [‘A0’, ‘A1’, ‘A2’, ‘A3’],
‘B’: [‘B0’, ‘B1’, ‘B2’, ‘B3’]})
df2 = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’, ‘K3’],
‘C’: [‘C0’, ‘C1’, ‘C2’, ‘C3’],
‘D’: [‘D0’, ‘D1’, ‘D2’, ‘D3’]})
df3 = pd.DataFrame({‘key1’: [‘K0’, ‘K0’, ‘K1’, ‘K2’],
‘key2’: [‘K0’, ‘K1’, ‘K0’, ‘K1’],
‘A’: [‘A0’, ‘A1’, ‘A2’, ‘A3’],
‘B’: [‘B0’, ‘B1’, ‘B2’, ‘B3’]})
df4 = pd.DataFrame({‘key1’: [‘K0’, ‘K1’, ‘K1’, ‘K2’],
‘key2’: [‘K0’, ‘K0’, ‘K0’, ‘K0’],
‘C’: [‘C0’, ‘C1’, ‘C2’, ‘C3’],
‘D’: [‘D0’, ‘D1’, ‘D2’, ‘D3’]})
print(pd.merge(df1, df2, on=‘key’))
print(‘------’)

left:第一个df

right:第二个df

on:参考键

print(pd.merge(df3, df4, on=[‘key1’,‘key2’]))

多个链接键

K0,K0有 两边都只有一个

K1,K0 df4有俩 所以匹配到三个

参数how → 合并方式

print(pd.merge(df3, df4,on=[‘key1’,‘key2’], how = ‘inner’))
print(‘------’)

inner:默认,取交集

print(pd.merge(df3, df4, on=[‘key1’,‘key2’], how = ‘outer’))
print(‘------’)

outer:取并集,数据缺失范围NaN

print(pd.merge(df3, df4, on=[‘key1’,‘key2’], how = ‘left’))
print(‘------’)

left:按照df3为参考合并,数据缺失范围NaN

print(pd.merge(df3, df4, on=[‘key1’,‘key2’], how = ‘right’))

right:按照df4为参考合并,数据缺失范围NaN

六、去重及替换

.duplicated / .replace


1.去重 .duplicated


s = pd.Series([1,1,1,1,2,2,2,3,4,5,5,5,5])
print(s.duplicated())
print(s[s.duplicated() == False])
print(‘-----’)

判断是否重复

通过布尔判断,得到不重复的值

s_re = s.drop_duplicates()
print(s_re)
print(‘-----’)

drop.duplicates移除重复

inplace参数:是否替换原值,默认False

df = pd.DataFrame({‘key1’:[‘a’,‘a’,3,4,5],
‘key2’:[‘a’,‘a’,‘b’,‘b’,‘c’]})
print(df.duplicated())
print(df[‘key2’].duplicated())
Dataframe中使用duplicated
 

2.替换 .replace

s = pd.Series(list(‘ascaazsd’))
print(s.replace(‘a’, np.nan))
print(s.replace([‘a’,‘s’] ,np.nan))
print(s.replace({‘a’:‘hello world!’,‘s’:123}))

可一次性替换一个值或多个值

可传入列表或字典


返回新的值,默认不改变原数据

加上inplace=True,就是在原有基础上修改。不会返回新的数据

七、数据分组


分组统计 - groupby功能 是pandas最重要的功能


① 根据某些条件将数据拆分成组

② 对每个组独立应用函数

③ 将结果合并到一个数据结构中


Dataframe在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中。

df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

1.分组

df = pd.DataFrame({‘A’ : [‘foo’, ‘bar’, ‘foo’, ‘bar’,‘foo’, ‘bar’, ‘foo’, ‘foo’],
‘B’ : [‘one’, ‘one’, ‘two’, ‘three’, ‘two’, ‘two’, ‘one’, ‘three’],
‘C’ : np.random.randn(8),
‘D’ : np.random.randn(8)})
print(df)
print(‘------’)

print(df.groupby(‘A’), type(df.groupby(‘A’)))
print(‘------’)

直接分组得到一个groupby对象,是一个中间数据,没有进行计算

a = df.groupby(‘A’).mean() B列有字母,这样写报错
b = df.groupby([‘A’,‘B’]).mean()
c = df.groupby([‘A’])[‘D’].mean() # 以A分组,算D的平均值

print(a,type(a),‘\n’,a.columns)
print(b,type(b),‘\n’,b.columns)
print(c,type©)

通过分组后的计算,得到一个新的dataframe

默认axis = 0,以行来分组

可单个或多个([])列分组

2.一般化Groupby方法:apply

df = pd.DataFrame({‘data1’:np.random.rand(5),
‘data2’:np.random.rand(5),
‘key1’:list(‘aabba’),
‘key2’:[‘one’,‘two’,‘one’,‘two’,‘one’]})

print(df.groupby(‘key1’).apply(lambda x: x.describe()))

apply直接运行其中的函数

这里为匿名函数,直接描述分组后的统计量

def f_df1(d,n):
return(d.sort_index()[:n])
def f_df2(d,k1):
return(d[k1])
print(df.groupby(‘key1’).apply(f_df1,2),‘\n’)

每组只显示两个数据

print(df.groupby(‘key1’).apply(f_df2,‘data2’))

print(type(df.groupby(‘key1’).apply(f_df2,‘data2’)))

f_df1函数:返回排序后的前n行数据

f_df2函数:返回分组后表的k1列,结果为Series,层次化索引

直接运行f_df函数

参数直接写在后面,也可以为.apply(f_df,n = 2))


八、数据读取

核心:read_table, read_csv, read_excel

1.读取普通分隔数据:read_table


可以读取txt,csv

文本如下

import os
os.chdir(r'C:\Users\dell\Desktop')

data1 = pd.read_table('array.txt', delimiter=',',header = 0, index_col=1)
print(data1)


# delimiter:用于拆分的字符,也可以用sep:sep = ','
# header:用做列名的序号,默认为0(第一行)
# index_col:指定某列为行索引,否则自动索引0, 1, .....

# read_table主要用于读取简单的数据,txt/csv

指定了第二列为行索引,所以有点乱

我们去掉,让它默认生成索引

读取csv的速度比excel快很多

数据库中调出的输出大多都是以csv为主,csv其实就是以逗号为分隔符的一种数据,就是本质就是txt。只不过分隔符是逗号

我们将这个txt改下后缀csv

直接可以用excel打开



2.读取csv数据:read_csv

先熟悉一下excel怎么导出csv

文件另存为

选csv格式

data2 = pd.read_csv(‘array.csv’,engine = ‘python’) 如果有编码问题,加上encoding=‘utf-8/gbk’

print(data2.head()) #这是默认打印出前五行 #读出来,直接就是Dataframe类型数据

engine:使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。

encoding:指定字符集类型,即编码,通常指定为’utf-8’

大多数情况先将excel导出csv,再读取

再来

3.创建csv


在Python中,我们经常需要将数据保存到CSV文件中以便后续处理或分析。

to_csv()函数是pandas库中的一个非常方便的函数,它允许我们将DataFrame对象保存为CSV文件。本文将详细介绍to_csv()函数的使用方法以及一些常见参数的解释。


1. to_csv()函数的基本语法

to_csv()函数是DataFrame对象的一个方法,可以通过如下方式调用:
DataFrame.to_csv(path_or_buf=None, sep=‘,’, na_rep=‘’, float_format=None, columns=None, header=True, index=True, index_label=None, mode=‘w’, encoding=None, compression=‘infer’, quoting=None, quotechar=‘"’, line_terminator=None, chunksize=None, date_format=None, doublequote=True, escapechar=None, decimal=‘.’)

参数解释:

path_or_buf:指定要保存CSV文件的路径或文件对象。默认为None,表示将数据保存为一个字符串并返回,而不是保存为文件。
sep:指定CSV文件的分隔符,默认为逗号",“。
na_rep:指定在CSV文件中如何表示缺失值,默认为空字符串”“。
float_format:指定浮点数的输出格式,默认为None,表示使用默认的浮点数格式。
columns:指定要保存的列,默认为None,表示保存所有列。
header:指定是否将列名保存到CSV文件中,默认为True。
index:指定是否保存行索引,默认为True。
index_label:指定行索引的名称,默认为None。
mode:指定打开文件的模式,默认为’w’,表示写入模式。
encoding:指定保存CSV文件时使用的编码,默认为None,表示使用系统默认编码。
compression:指定保存CSV文件时使用的压缩格式,默认为’infer’,表示自动选择压缩格式。
quoting:指定在CSV文件中如何引用非数值类型的数据,默认为None,表示不引用。
quotechar:指定在CSV文件中引用数据时使用的字符,默认为双引号’”‘。
line_terminator:指定CSV文件中行的终止符,默认为None,表示使用系统默认终止符。
chunksize:指定每次写入文件的行数,默认为None,表示一次性写入整个DataFrame。
date_format:指定日期格式,默认为None,表示使用默认的日期格式。
doublequote:指定在CSV文件中如何处理引号,默认为True,表示将双引号转义为两个双引号。
escapechar:指定在CSV文件中如何处理转义字符,默认为None,表示不进行转义处理。
decimal:指定浮点数的小数点符号,默认为’.’。

2. to_csv()函数的简单示例

下面的示例展示了如何使用to_csv()函数将DataFrame保存为CSV文件:

import pandas as pd

# 创建一个DataFrame对象
data = {'Name': ['Tom', 'Bob', 'Alice'],
        'Age': [20, 25, 30],
        'Gender': ['Male', 'Male', 'Female']}
df = pd.DataFrame(data)

# 将DataFrame保存为CSV文件
df.to_csv('data.csv')

应用,将excel表中,一列数据拆分出几列展示

将C列中这些数据,展示到一行


代码:

import json

import pandas as pd

import os
os.chdir(r'C:\Users\dell\Desktop')


#转化为字典
def get_json(value):
    try:
        return json.loads(value)
    except BaseException as e:
        print("出错了,",e)


def get_data():
    data = pd.read_csv('测试.csv',engine = 'python')

    #读出来,创建个choose列存放原始数据
    data["choose"] = data['CONCAT(c.choose,"")'].apply(get_json)
    # data.dropna(subset="choose")

    print(data["choose"][1])
    for i in range(9):
        data[f"remark_{i}"] = data["choose"].apply(lambda a:a["vChoose"][i]["remark"] if a and "vChoose" in a and i < len(a["vChoose"]) else None)
        data[f"isChoosed_{i}"] = data["choose"].apply(lambda a:a["vChoose"][i]["isChoosed"] if a and "vChoose" in a and i < len(a["vChoose"]) else None)
        data[f"index_{i}"] = data["choose"].apply(lambda a:a["vChoose"][i]["index"] if a and "vChoose" in a and i < len(a["vChoose"]) else None)

    #删除自己创建的choose列
    data.drop("choose",axis=1,inplace=True)

    print(data.columns)

    #保存到csv
    data.to_csv("new_data.csv",encoding="utf-8-sig",index=False)






if __name__ == '__main__':
    get_data()


读取excel数据:read_excel 这依赖openpyxl

data3 = pd.read_excel('服务器磁盘分区优化.xlsx',header=0)
print(data3)
# io :文件路径。
# sheetname:返回多表使用sheetname=[0,1],若sheetname=None是返回全表 → ① int/string 返回的是dataframe ②而none和list返回的是dict
# header:指定列名行,默认0,即取第一行
# index_col:指定列为索引列,也可以使用u”strings”


九、pycharm打印dataframe显示不全解决

很多时候,当我们在控制台输出dataframe时,显示不全,显示如下


解决方案: pandas 库

在导入pandas之后添加以下代码

# 显示所有列
pd.set_option('display.max_columns', None)

# 显示所有行
pd.set_option('display.max_rows', None)

# 设置value的显示长度
pd.set_option('max_colwidth', 100)

# 设置1000列时才换行
pd.set_option('display.width', 1000)


输出结果:

但是这样输出就比较慢了。

相关文章
|
2天前
|
数据可视化 数据挖掘 数据处理
进阶 pandas DataFrame:挖掘高级数据处理技巧
【5月更文挑战第19天】本文介绍了Pandas DataFrame的高级使用技巧,包括数据重塑(如`pivot`和`melt`)、字符串处理(如提取和替换)、日期时间处理(如解析和时间序列操作)、合并与连接(如`merge`和`concat`),以及使用`apply()`应用自定义函数。这些技巧能提升数据处理效率,适用于复杂数据分析任务。推荐进一步学习和探索Pandas的高级功能。
|
2天前
|
数据挖掘 数据处理 Python
【Python DataFrame 专栏】深入探索 pandas DataFrame:高级数据处理技巧
【5月更文挑战第19天】在 Python 数据分析中,pandas DataFrame 是核心工具。本文介绍了几个高级技巧:1) 横向合并 DataFrame;2) 数据分组与聚合;3) 处理缺失值;4) 数据重塑;5) 条件筛选;6) 使用函数处理数据。掌握这些技巧能提升数据处理效率和分析深度,助你更好地发掘数据价值。
【Python DataFrame 专栏】深入探索 pandas DataFrame:高级数据处理技巧
|
6天前
|
存储 JSON 数据处理
从JSON数据到Pandas DataFrame:如何解析出所需字段
从JSON数据到Pandas DataFrame:如何解析出所需字段
19 1
|
6天前
|
Python
使用Python pandas的sort_values()方法可按一个或多个列对DataFrame排序
【5月更文挑战第2天】使用Python pandas的sort_values()方法可按一个或多个列对DataFrame排序。示例代码展示了如何按'Name'和'Age'列排序 DataFrame。先按'Name'排序,再按'Age'排序。sort_values()的by参数接受列名列表,ascending参数控制排序顺序(默认升序),inplace参数决定是否直接修改原DataFrame。
28 1
|
6天前
|
NoSQL Serverless Python
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。
【5月更文挑战第2天】在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。方法一是直接赋值,如`df['C'] = 0`,创建新列C并初始化为0。方法二是应用函数,例如定义`add_column`函数计算A列和B列之和,然后使用`df.apply(add_column, axis=1)`,使C列存储每行A、B列的和。
50 0
|
6天前
|
Python
在Pandas中,利用boolean indexing可按条件过滤DataFrame
【5月更文挑战第2天】在Pandas中,利用boolean indexing可按条件过滤DataFrame。通过&(和)和|(或)操作符可基于多个条件筛选。
20 1
|
6天前
|
数据采集 索引 Python
Pandas之DataFrame,快速入门,迅速掌握(二)
Pandas之DataFrame,快速入门,迅速掌握(二)
|
6天前
|
编译器 索引 Python
Pandas之DataFrame,快速入门,迅速掌握(一)
Pandas之DataFrame,快速入门,迅速掌握(一)
|
19小时前
|
数据采集 数据可视化 数据处理
利用Python和Pandas库实现高效的数据处理与分析
在大数据和人工智能时代,数据处理与分析已成为不可或缺的一环。Python作为一门强大的编程语言,结合Pandas库,为数据科学家和开发者提供了高效、灵活的数据处理工具。本文将介绍Pandas库的基本功能、优势,并通过实际案例展示如何使用Pandas进行数据清洗、转换、聚合等操作,以及如何利用Pandas进行数据可视化,旨在帮助读者深入理解并掌握Pandas在数据处理与分析中的应用。
|
1天前
|
架构师 数据挖掘 Python
最全pandas库(Python),2024年最新阿里云架构师面试
最全pandas库(Python),2024年最新阿里云架构师面试
最全pandas库(Python),2024年最新阿里云架构师面试