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月前
|
SQL 索引 Python
Pandas中DataFrame合并的几种方法
Pandas中DataFrame合并的几种方法
164 0
|
11天前
|
SQL 数据采集 数据可视化
Pandas 数据结构 - DataFrame
10月更文挑战第26天
26 2
Pandas 数据结构 - DataFrame
|
3月前
|
索引 Python
Pandas学习笔记之Dataframe
Pandas学习笔记之Dataframe
|
3月前
|
数据挖掘 大数据 数据处理
数据分析师的秘密武器:精通Pandas DataFrame合并与连接技巧
【8月更文挑战第22天】在数据分析中,Pandas库的DataFrame提供高效的数据合并与连接功能。本文通过实例展示如何按员工ID合并基本信息与薪资信息,并介绍如何基于多列(如员工ID与部门ID)进行更复杂的连接操作。通过调整`merge`函数的`how`参数(如&#39;inner&#39;、&#39;outer&#39;等),可实现不同类型的连接。此外,还介绍了使用`join`方法根据索引快速连接数据,这对于处理大数据集尤其有用。掌握这些技巧能显著提升数据分析的能力。
65 1
|
3月前
【Pandas+Python】初始化一个全零的Dataframe
初始化一个100*3的0矩阵,变为Dataframe类型,并为每列赋值一个属性。
41 2
|
3月前
|
SQL 数据采集 JSON
Pandas 使用教程 Series、DataFrame
Pandas 使用教程 Series、DataFrame
59 0
|
3月前
|
Python
[pandas]从多个文件中构建dataframe
[pandas]从多个文件中构建dataframe
|
3月前
|
索引 Python
【Pandas】Pandas Dataframe 常用用法
Pandas DataFrame的常用操作示例,包括筛选数据、索引操作、合并DataFrame、设置和排序索引、文本处理、列重命名、处理缺失值、排序以及删除满足特定条件的行等技巧。
59 0
|
3月前
|
Python
【Pandas】Pandas的DataFrame按行插入list数据或者读取一行并存为csv文件
本文提供了使用Pandas库对DataFrame进行操作的示例代码。
177 0
|
4月前
|
存储 数据可视化 数据处理
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。