Pandas笔记
Published in:2023-07-16 | category: Ai

pandas介绍: Pandas 是一个强大的数据处理和分析库,提供了丰富的数据结构和数据操作函数,使得数据的清洗、转换、分析和可视化变得更加简单和高效。
学习文章:https://blog.csdn.net/Strive_For_Future/article/details/126710810

生成数据表

导入数据

1
2
3
4
5
6
7
8
pd.read_excel('name.xlsv') #导入csv文件
pd.read_csv("name.csv" , sep= ";" , encoding= "utf-8" , nrows=1000, skiprows=[2,5]) # 导入xlsx文件

# sep 分隔符
# encoding 编码模式
# nrows=1000 读取前1000行数据
# skiprows 读取文件时移除第二行和第五行

还有 read_clipboard, read_sql

生成数据表

1
pd.DataFrame(pd.read_excel('name.xlsv'))
id 名字
1 小明
2 小红
3 小江

查看数据表信息

查看维度

1
df.shape

(3, 2)

数据表基本信息(维度,列名,数据格式,所占空间等)

1
df.info()

df.info()

查看行索引名(第一列)

1
2
df.index # 返回series对象
df.index.values # 返回列表

[0 1 2]

查看列索引名(第一行)

1
2
df.columns # 返回series对象
df.columns # 返回列表

[‘id’ ‘名字’]

定位表格中的指定元素

1
2
3
4
5
6
7
8
print(df.at['行标签名', '列标签名'])
print(df.iat['行索引号', '列索引号'])

print(df.loc['行标签名', '列标签名'])
print(df.iloc[行索引数字, 列索引数字])

print(df.loc['行标签名1':'行标签名2', '列标签名1': '列标签名2'])
print(df.iloc[行索引数字1:行索引数字2, 列索引数字1:列索引数字2])
1
2
3
4
5
6
7
8
9
data = {'A': [1, 2, 3],
'B': [4, 5, 5],
'C': [6, 7, 8]}
df = pd.DataFrame(data)

# 使用at[]访问DataFrame中的单个元素
value = df.iloc[1, 0:2]
print(df)
print(value)

数据的类型

1
2
df.dtypes
df['B'].dtypes

A int64
B int64
C int64
dtype: object

int64

查看某一列的值

1
df["名字"].values

[‘小明’ ‘小红’ ‘小江’]

查看某一行的值

1
df.iloc[3].values

[3 ‘小江’]

查看是否空值

1
df.isnull()
  id     名字

0 False False
1 False False
2 False False

1
df['B'].isnull()

查看某一列的唯一值

1
df['id'].unique()

[1 2 3]

查看数据表的值

1
df.values

[[1 ‘小明’]
[2 ‘小红’]
[3 ‘小江’]]

查看前n行/后n行的值

1
2
df.head(2)
df.tail(2)

id 名字
0 1 小明
1 2 小红
id 名字
1 2 小红
2 3 小江

满足特定文件的行

1
2
df[df.id>1]

导出文件

1
2
3
4
data = pd.read_excel("name.xlsx")
df = pd.DataFrame(data)
d = data.loc[data['id']==2,['名字']]
d.to_excel('1.xlsx')

数据表清洗

去除空值

清除空值

1
df['名字']=df['名字'].map(str.strip)

将空值使用0代替

1
df.fillna(value=0)

将控制使用均值代替

1
df['名字'].fillna(df['名字'].mean())

大小写转换

1
2
df['column_name'] = df['column_name'].str.upper()  # 转换为大写
df['column_name'] = df['column_name'].str.lower() # 转换为小写

更改数据格式

1
df('id').astype(int)

更改列名

1
df.rename(columns={'改之前的列名': '改之后的列名'})

删除重复的值

1
2
df['id'].drop_duplicates() # 删除重复值的第一个
df['id'].drop_duplicates(keep='last') # 删除重复值的最后一个

替换数据

1
df['名字'].replace('小明''小黑')

数据预处理

合并

Pandas 提供了多种函数用于合并数据,常用的函数有以下几种:

  1. pd.concat(): 将多个数据框按照指定的轴方向进行连接操作。可以进行垂直连接(纵向)或水平连接(横向)。
  2. df.append(): 将一个数据框追加到另一个数据框的末尾,实现垂直连接操作。(新版本弃用)
  3. df.join(): 将多个数据框基于索引进行水平连接。
  4. pd.merge(): 基于指定的列或索引进行数据框的合并操作,类似于关系型数据库中的 JOIN 操作。支持多种连接方式,如内连接、左连接、右连接和外连接等。

merge

使用merge(表1,表2,how=属性)进行合并操作,不同属性值对应不同的合并方式

inner 交集

1
df_inner = pd.merge(df, df1, how='inner') # 匹配交集

left/right 左连接/右连接

1
df_left = pd.merge(df,df1,how='left')
1
2
3
4
5
6
7
8
9
10
11
12
df = pd.DataFrame({
'id': [1, 2, 3],
'名字': ['小明', '小红', '小江']
})

df1 = pd.DataFrame({
'id': [1, 2, 3],
'成绩': [80, 85, 78]
})

df_left = pd.merge(df,df1,how='left') # 左连接
df_right = pd.merge(df,df1,how='right') #右连接

id 名字 成绩
0 1 小明 80
1 2 小红 85
2 3 小江 78
id 名字 成绩
0 1 小明 80
1 2 小红 85
2 3 小江 78

outer 交集

1
2
3
4
5
6
7
8
9
10
11
df = pd.DataFrame({
'id': [1, 2, 3],
'名字': ['小明', '小红', '小江']
})

df1 = pd.DataFrame({
'id': [1, 2, 3],
'名字': ['小明', '小黑', '小汪']
})

df_outer = pd.merge(df, df1, how='outer') # 匹配交集

0 1 小明
1 2 小红
2 3 小江
3 2 小黑
4 3 小汪

concat

1
2
3
4
5
6
7
result = pd.concat(objs, axis=0, join='outer', ignore_index=False)


objs: 一个包含要连接的数据框的序列,可以是列表、元组或字典。
axis: 连接的轴方向,0 表示垂直连接(纵向),1 表示水平连接(横向)。
join: 连接的方式,默认为 'outer',表示按照并集进行连接。可选的取值还包括 'inner',表示按照交集进行连接。
ignore_index: 是否忽略原始索引并生成新的整数索引,默认为 False。
1
2
3
4
5
6
7
8
9
10
11
12
df = pd.DataFrame({
'id': [1, 2, 3],
'名字': ['小明', '小红', '小江']
})

df1 = pd.DataFrame({
'id': [1, 2, 3],
'名字': ['小明', '小黑', '小汪']
})

result = pd.concat([df,df1],axis=0)
print(result)

id 名字
0 1 小明
1 2 小红
2 3 小江
0 1 小明
1 2 小黑
2 3 小汪

join

1
result = left.join(right, on='key') #使用key作为索引

设置索引列

1
df_inner.set_index('id')

按照特定列的值排序:

1
df_inner.sort_values(by=['age'])

按照索引列排序:

1
df_inner.sort_index()

如果prince列的值>3000,group列显示high,否则显示low:

1
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')

对复合多个条件的数据进行分组标记

1
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1

解释: 有一个名为 df_inner 的 DataFrame,其中包含了城市(’city’)和价格(’price’)两列数据。我们想要对满足条件的行添加一个新的列 ‘sign’,并赋值为 1。

对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size

1
pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size'])
  • x.split(‘-‘) for x in df_inner[‘category’] 是一个生成器表达式,用于对 df_inner[‘category’] 列中的每个元素应用 split(‘-‘) 操作,将其拆分成两部分,并生成一个新的迭代器。
  • index=df_inner.index 指定了新 DataFrame 的索引,使用了 df_inner 的索引。
  • columns=[‘category’, ‘size’] 指定了新 DataFrame 的列名。

将完成分裂后的数据表和原df_inner数据表进行匹配

1
df_inner=pd.merge(df_inner,split,right_index=True, left_index=True)
  • df_inner 是待合并的第一个 DataFrame。
  • split 是待合并的第二个 DataFrame。
  • right_index=True 表示使用 split DataFrame 的索引作为合并的依据。
  • left_index=True 表示使用 df_inner DataFrame 的索引作为合并的依据。
Prev:
numpy笔记
Next:
机器学习