Pandas学习笔记(1)

melted_df = df.melt(id_vars=‘Name’, value_vars=[‘Math’, ‘Physics’, ‘Chemistry’], var_name=‘Subject’, value_name=‘Score’)

打印转换后的长格式数据

print(melted_df)



Name    Subject  Score

0 Alice Math 90
1 Bob Math 85
2 Cathy Math 95
3 Alice Physics 88
4 Bob Physics 82
5 Cathy Physics 90
6 Alice Chemistry 87
7 Bob Chemistry 80
8 Cathy Chemistry 92


长格式:典型的包括3列,每一行就代表某一行某一列对应的某个值,从而也可以将一张表的信息全部装下


#### 长格式转换为宽格式



import pandas as pd

创建示例DataFrame

data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Cathy’, ‘Alice’, ‘Bob’, ‘Cathy’, ‘Alice’, ‘Bob’, ‘Cathy’],
‘Subject’: [‘Math’, ‘Math’, ‘Math’, ‘Physics’, ‘Physics’, ‘Physics’, ‘Chemistry’, ‘Chemistry’, ‘Chemistry’],
‘Score’: [90, 85, 95, 88, 82, 90, 87, 80, 92]
}
df = pd.DataFrame(data)

使用pivot函数将数据从长格式转换为宽格式

pivot_df = df.pivot(index=‘Name’, columns=‘Subject’, values=‘Score’).reset_index()

打印转换后的宽格式数据

print(pivot_df)



Subject Name Chemistry Math Physics
0 Alice 87 90 88
1 Bob 80 85 82
2 Cathy 92 95 90


宽格式:将一个东西的所有信息都放在一行上,和常规数据库的表类似


#### 垂直拼接



import pandas as pd

创建两个示例DataFrame

df1 = pd.DataFrame({‘A’: [‘A0’, ‘A1’, ‘A2’],
‘B’: [‘B0’, ‘B1’, ‘B2’],
‘C’: [‘C0’, ‘C1’, ‘C2’]})

df2 = pd.DataFrame({‘A’: [‘A3’, ‘A4’, ‘A5’],
‘B’: [‘B3’, ‘B4’, ‘B5’],
‘C’: [‘C3’, ‘C4’, ‘C5’]})

使用concat函数在垂直方向上合并这两个DataFrame

result = pd.concat([df1, df2])

打印合并结果

print(result)



A   B   C

0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
0 A3 B3 C3
1 A4 B4 C4
2 A5 B5 C5


#### 水平拼接



import pandas as pd

创建两个示例DataFrame

df1 = pd.DataFrame({‘A’: [‘A0’, ‘A1’, ‘A2’],
‘B’: [‘B0’, ‘B1’, ‘B2’]})

df2 = pd.DataFrame({‘C’: [‘C0’, ‘C1’, ‘C2’],
‘D’: [‘D0’, ‘D1’, ‘D2’]})

使用concat函数在水平方向上合并这两个DataFrame

result = pd.concat([df1, df2], axis=1)

打印合并结果

print(result)



A   B   C   D

0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2


#### 根据某列进行排序



import pandas as pd

创建示例数据

data = {
‘brand’: [‘Ford’, ‘Toyota’, ‘BMW’, ‘Audi’],
‘mpg’: [25, 30, 27, 23]
}
df = pd.DataFrame(data)

使用 sort_values() 方法按照mpg列对 DataFrame 进行排序

sorted_df = df.sort_values(‘mpg’)
print(sorted_df)



brand  mpg

3 Audi 23
0 Ford 25
2 BMW 27
1 Toyota 30


#### 根据索引进行排序



import pandas as pd

创建示例数据

data = {
‘col1’: [3, 2, 1],
‘col2’: [‘A’, ‘B’, ‘C’]
}
df = pd.DataFrame(data)

对 DataFrame 根据索引进行排序

sorted_df = df.sort_index()
print(sorted_df)



col1 col2
0 3 A
1 2 B
2 1 C


#### 重命名列名



import pandas as pd

创建示例数据

data = {
‘x’: [1, 2, 3],
‘y’: [4, 5, 6],
‘z’: [7, 8, 9]
}
df = pd.DataFrame(data)

使用 rename() 方法重命名列

df_renamed = df.rename(columns={‘y’: ‘year’})

print(df_renamed)



x year z
0 1 4 7
1 2 5 8
2 3 6 9


#### 重置索引



import pandas as pd

创建示例数据

data = {
‘index’: [‘A’, ‘B’, ‘C’],
‘value’: [1, 2, 3]
}
df = pd.DataFrame(data)

对 DataFrame 进行重置索引

reset_df = df.reset_index()
print(reset_df)



level_0 index value
0 0 A 1
1 1 B 2
2 2 C 3


将当前的索引列变为普通的数据列,并重新生成默认整数索引


#### 删除指定的列



import pandas as pd

创建示例数据

data = {
‘Length’: [2, 3, 4],
‘Height’: [3, 4, 5],
‘Width’: [1, 1, 1]
}
df = pd.DataFrame(data)

使用 drop() 方法删除指定的列

new_df = df.drop(columns=[‘Length’, ‘Height’])
print(new_df)



Width
0 1
1 1
2 1


### 筛选


#### 筛选行


筛选符合条件的行



import pandas as pd

创建示例DataFrame

data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Cathy’, ‘David’],
‘Age’: [25, 30, 22, 28],
‘Gender’: [‘F’, ‘M’, ‘F’, ‘M’]
}
df = pd.DataFrame(data)

过滤年龄大于25岁的行

filtered_df = df[df[‘Age’] > 25]

打印过滤后的DataFrame

print(filtered_df)



Name  Age Gender

1 Bob 30 M
3 David 28 M


去除重复行



import pandas as pd

创建示例DataFrame

data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Cathy’, ‘Alice’, ‘Bob’],
‘Age’: [25, 30, 22, 25, 30]
}
df = pd.DataFrame(data)

删除重复行

deduplicated_df = df.drop_duplicates()

打印删除重复行后的DataFrame

print(deduplicated_df)



Name  Age

0 Alice 25
1 Bob 30
2 Cathy 22


通过query筛选符合条件的行



import pandas as pd

创建示例DataFrame

data = {
‘Width’: [3, 4, 2, 5],
‘Length’: [7, 6, 8, 5]
}
df = pd.DataFrame(data)

使用query来筛选行

filtered_df = df.query(‘Length > 7 and Width < 8’)

打印筛选后的DataFrame

print(filtered_df)



Width Length
2 2 8


除了上面的,还有:随机取出某个比例的行、随机取出指定数量的行,取出最大的n行,取出最小的n行,取出前n行,取出后n行


#### 筛选列


筛选多列



import pandas as pd

创建示例DataFrame

data = {
‘id’: [1, 2, 3, 4],
‘width’: [3, 4, 2, 5],
‘length’: [7, 6, 8, 5],
‘species’: [‘a’, ‘b’, ‘a’, ‘c’]
}
df = pd.DataFrame(data)

选择特定列

selected_columns = df[[‘width’, ‘length’, ‘species’]]

打印选择的列

print(selected_columns)



width length species
0 3 7 a
1 4 6 b
2 2 8 a
3 5 5 c


筛选单列



import pandas as pd

创建示例DataFrame

data = {
‘width’: [3, 4, 2, 5],
‘length’: [7, 6, 8, 5],
‘species’: [‘a’, ‘b’, ‘a’, ‘c’]
}
df = pd.DataFrame(data)

选择特定列

selected_column = df[‘width’]

打印选择的列

print(selected_column)



0 3
1 4
2 2
3 5
Name: width, dtype: int64


筛选符合正则表达式的列



import pandas as pd

创建示例DataFrame

data = {
‘apple’: [3, 4, 2, 5],
‘banana’: [7, 6, 8, 5],
‘cherry’: [2, 8, 5, 7],
‘date’: [11, 12, 13, 14]
}
df = pd.DataFrame(data)

使用正则表达式选择列名

selected_columns = df.filter(regex=‘^a’) # 选择以字母 ‘a’ 开头的列

打印选择的列

print(selected_columns)



apple
0 3
1 4
2 2
3 5


#### 筛选行和列


iloc:通过索引数字定位的形式



import pandas as pd

创建示例DataFrame

data = {
‘A’: [1, 2, 3, 4],
‘B’: [5, 6, 7, 8],
‘C’: [9, 10, 11, 12],
‘D’: [13, 14, 15, 16],
‘E’: [17, 18, 19, 20]
}
df = pd.DataFrame(data)

使用iloc来选择特定的行和列

selected_data = df.iloc[:, [1, 2, 4]]

打印选择的行和列

print(selected_data)



B C E
0 5 9 17
1 6 10 18
2 7 11 19
3 8 12 20


loc:通过列名定位的形式



import pandas as pd

创建示例DataFrame

data = {
‘a’: [15, 8, 12, 20],
‘b’: [25, 18, 22, 30],
‘c’: [35, 28, 32, 40]
}
df = pd.DataFrame(data)

使用 loc 来选择符合特定条件的行和指定的列

selected_data = df.loc[df[‘a’] > 10, [‘a’, ‘c’]]

打印选择的行和列

print(selected_data)



a   c

0 15 35
2 12 32
3 20 40


总结:可以看到无论是iloc,还是loc都可以传递两个参数,第一个参数代表过滤行,第二个条件代表过滤列,如果只有一个参数,那么只会过滤行,同时参数支持多种类型,比如


* **冒号**,代表整行,如df.iloc[:, [1, 2, 5]]
* **索引列表**,代表列号,df.iloc[:, [1, 2, 5]]
* **索引1:索引2**,代表列范围,如df.iloc[10:20]
* **列名1:列名2**,代表列范围,如df.loc[:, ‘x2’:‘x4’]
* **比较运算**,代表符合条件的行,如df.loc[df[‘a’] > 10, ['a’, ‘c’]]


iat、at类似,不过是筛选单个值


### 汇总数据


#### 获得各个值的次数



import pandas as pd

创建示例数据

data = {
‘w’: [‘A’, ‘B’, ‘A’, ‘C’, ‘A’, ‘A’, ‘B’]
}
df = pd.DataFrame(data)

使用 value_counts() 方法统计 ‘w’ 列中各个取值的出现次数

value_counts_result = df[‘w’].value_counts()
print(value_counts_result)



w
A 4
B 2
C 1


#### 获得行数



import pandas as pd

创建示例数据

data = {
‘A’: [1, 2, 3],
‘B’: [‘a’, ‘b’, ‘c’]
}
df = pd.DataFrame(data)

使用 len(df) 获取 DataFrame 的行数

rows_count = len(df)
print(rows_count)



3


#### 获得行数和列数



import pandas as pd

创建示例数据

data = {
‘A’: [1, 2, 3],
‘B’: [‘a’, ‘b’, ‘c’]
}
df = pd.DataFrame(data)

使用 shape 属性获取 DataFrame 的行数和列数

shape = df.shape
print(shape)



(3, 2)


#### 获得唯一值的个数



import pandas as pd

创建示例数据

data = {
‘w’: [‘A’, ‘B’, ‘A’, ‘C’, ‘A’, ‘A’, ‘B’]
}
df = pd.DataFrame(data)

使用 nunique() 方法获取 ‘w’ 列的唯一值个数

unique_values_count = df[‘w’].nunique()
print(unique_values_count)



3


#### 获得每一列的统计信息



import pandas as pd

创建示例数据

data = {
‘A’: [1, 2, 3, 4, 5],
‘B’: [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)

使用 describe() 方法生成描述性统计信息

description = df.describe()
print(description)



          A          B

count 5.000000 5.000000
mean 3.000000 30.000000
std 1.581139 15.811388
min 1.000000 10.000000
25% 2.000000 20.000000
50% 3.000000 30.000000
75% 4.000000 40.000000
max 5.000000 50.000000


#### 其他



import pandas as pd

创建示例DataFrame

data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Cathy’, ‘David’],
‘Age’: [25, 30, 22, 28],
‘Score’: [80, 75, 90, 85]
}
df = pd.DataFrame(data)

计算年龄的均值

average_age = df[‘Age’].mean()

计算分数的总和

total_score = df[‘Score’].sum()

打印汇总结果

print(“Average Age:”, average_age)
print(“Total Score:”, total_score)



Average Age: 26.25
Total Score: 330


出了上面的形式,还可以取出某一列数据,求和、计算平均值、最大值、最小值、百分位数、标准差、中位数等


### 分组数据


#### 根据某一列来分组



import pandas as pd

创建示例数据

data = {
‘col1’: [‘A’, ‘B’, ‘A’, ‘B’, ‘A’, ‘A’],
‘col2’: [1, 2, 2, 3, 3, 4],
‘col3’: [10, 20, 30, 40, 50, 60]
}
df = pd.DataFrame(data)

按 ‘col1’ 列进行分组并计算平均值

grouped = df.groupby(by=‘col1’).mean()
print(grouped)



  col2  col3

col1
A 2.5 37.5
B 2.5 30.0


按指定的列进行分组,然后计算每一列,每个分组


#### 根据某一个索引来分组



import pandas as pd

创建示例DataFrame(带有多层索引)

arrays = [[‘A’, ‘A’, ‘B’, ‘B’], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=(‘ind’, ‘sub_ind’))
df = pd.DataFrame({‘values’: [10, 20, 30, 40]}, index=index)
print(df)

按照第一级索引 “ind” 进行分组,并计算每组的总和

grouped = df.groupby(level=“ind”).sum()

打印分组计算的结果

print(grouped)



         values

ind sub_ind
A 1 10
2 20
B 1 30
2 40



 values

ind
A 30
B 70


按指定的行索引分组,然后计算每一列、每个分组


#### 下移/上移



import pandas as pd

创建示例数据

data = {
‘value’: [10, 20, 30, 40, 50]
}
df = pd.DataFrame(data)

使用 shift(1) 方法将数据向下移动一个位置

shifted_df = df.shift(1)
print(shifted_df)



value
0 NaN
1 10.0
2 20.0
3 30.0
4 40.0


#### 秩



import pandas as pd

创建示例数据

data = {
‘A’: [10, 20, 20, 30, 30, 30]
}
df = pd.DataFrame(data)

使用 rank(method=‘dense’) 方法计算 ‘A’ 列中各个元素的秩

ranked_values = df[‘A’].rank(method=‘dense’)
print(ranked_values)



0 1.0
1 2.0
2 2.0
3 3.0
4 3.0
5 3.0
Name: A, dtype: float64


#### 累计值


比如累加和、累加最大值、最小值、累加乘积



import pandas as pd

创建示例数据

data = {
‘A’: [1, 2, 3, 4, 5]
}
df = pd.DataFrame(data)

使用 cumsum() 方法计算 ‘A’ 列中各个元素的累积和

cumulative_sum = df[‘A’].cumsum()
print(cumulative_sum)



0 1
1 3
2 6
3 10
4 15
Name: A, dtype: int64


### 处理缺失值


#### 删除缺失值



import pandas as pd

创建示例数据

data = {
‘A’: [1, 2, None, 4],
‘B’: [None, 5, 6, 7],
‘C’: [8, 9, 10, 11]
}
df = pd.DataFrame(data)

删除包含缺失值的行

cleaned_df = df.dropna()
print(cleaned_df)



 A    B   C

1 2.0 5.0 9
3 4.0 7.0 11


#### 填充缺失值



import pandas as pd

创建示例数据

data = {
‘A’: [1, 2, None, 4],
‘B’: [None, 5, 6, 7],
‘C’: [8, 9, 10, 11]
}
df = pd.DataFrame(data)

用指定值填充缺失值

filled_df = df.fillna(value=0)
print(filled_df)



 A    B   C

0 1.0 0.0 8
1 2.0 5.0 9
2 0.0 6.0 10
3 4.0 7.0 11


### 构建新列


#### 使用assign增加新的列



import pandas as pd

创建示例数据

data = {
‘Length’: [2, 3, 4, 5],
‘Height’: [3, 4, 5, 6]
}
df = pd.DataFrame(data)

使用 assign() 方法计算面积并创建新的列

df_with_area = df.assign(Area=lambda x: x[‘Length’] * x[‘Height’])
print(df_with_area)



Length Height Area
0 2 3 6
1 3 4 12
2 4 5 20
3 5 6 30


#### 通过数据运算增加单列



import pandas as pd

创建示例数据

data = {
‘Length’: [2, 3, 4, 5],
‘Height’: [3, 4, 5, 6],
‘Depth’: [1, 2, 1, 3]
}
df = pd.DataFrame(data)

通过对现有列进行运算创建新列

df[‘Volume’] = df[‘Length’] * df[‘Height’] * df[‘Depth’]
print(df)



Length Height Depth Volume
0 2 3 1 6
1 3 4 2 24
2 4 5 1 20
3 5 6 3 90


#### 使用qcut进行分箱


 **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/28ce596df30403c77a818096579ba8c2.png)

![img](https://img-blog.csdnimg.cn/img_convert/bdb206368a65051604457b37ba4f5970.png)

![img](https://img-blog.csdnimg.cn/img_convert/ca580f8db561b2c6c9b80b4afabc7d2c.png)

![img](https://img-blog.csdnimg.cn/img_convert/9327fb0607c25c312094be969f780c18.png)

![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)

![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**

olume'] = df['Length'] \* df['Height'] \* df['Depth']
print(df)

   Length  Height  Depth  Volume
0       2       3      1       6
1       3       4      2      24
2       4       5      1      20
3       5       6      3      90

使用qcut进行分箱

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-TzQS03aE-1713602036237)]

[外链图片转存中…(img-XGVZ1Eud-1713602036238)]

[外链图片转存中…(img-z4PMkOno-1713602036238)]

[外链图片转存中…(img-g8L3Yt4Q-1713602036239)]

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值