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)
输出结果:
但是这样输出就比较慢了。