Pandas基础-CDA学习打卡

news/2025/2/25 18:34:46/文章来源:https://www.cnblogs.com/w-j-q/p/18736973

Pandas

Pandas 是一个开源的 Python 数据分析库,它提供了高性能、易用的数据结构和数据分析工具。Pandas 的设计理念是让数据处理和分析工作在 Python 中变得更加容易。以下是 Pandas 的一些关键特性:

数据结构

Series:一维数组,类似于 Python 的列表,但是每个元素都有一个索引。

DataFrame:二维表格结构,类似于 Excel 或 SQL 表,每列可以是不同的数据类型。

Panel:三维数组,较少使用,主要在处理多维度数据时使用。

常用功能

数据导入:支持多种数据格式,如 CSV、Excel、SQL、HDF5 等。

数据清洗:缺失值处理、重复值处理、数据类型转换等。

数据筛选:基于条件筛选数据。

数据分组:类似于 SQL 的分组功能,支持聚合、转换等操作。

数据合并:支持多种方式的合并(merge)、连接(join)操作。

时间序列处理:提供强大的时间序列处理功能。

文本数据处理:字符串操作、正则表达式等。

数据类型 Series

Series:一维数组。

import pandas  as pd
s = pd.Series([2,3,5,7,11],name='A')
s
0     2
1     3
2     5
3     7
4    11
Name: A, dtype: int64
# 以时间为索引的Seriesdts1 = pd.DatetimeIndex(['2024-01-01 00:00:00','2024-01-01 03:00:00','2024-01-01 06:00:00'])
dts1
DatetimeIndex(['2024-01-01 00:00:00', '2024-01-01 03:00:00','2024-01-01 06:00:00'],dtype='datetime64[ns]', freq=None)
# 另一种写法 pd.date_range可以按一定的频率生成时间序列dts2 = pd.date_range(start = '2024-01-01',periods=6,freq='3H')
dts2
DatetimeIndex(['2024-01-01 00:00:00', '2024-01-01 03:00:00','2024-01-01 06:00:00', '2024-01-01 09:00:00','2024-01-01 12:00:00', '2024-01-01 15:00:00'],dtype='datetime64[ns]', freq='3H')
dts3 = pd.date_range('2024-01-01',periods=6,freq='d')
dts3
DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04','2024-01-05', '2024-01-06'],dtype='datetime64[ns]', freq='D')

数据类型 DataFrame

DataFrame:二维的表格数据结构,可以理解为Series的容器,既有行索引,又有列索引。

# 从字典 创建DataFrame
d = {'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]}df = pd.DataFrame(data=d)
df
ABC
0147
1258
2369
# 从列表创建DataFrame
d = [[4,7,10],[5,8,11],[6,9,11]]df1 = pd.DataFrame(data=d,index=['a','b','c'],columns=["A","B","C"]
)df1
ABC
a4710
b5811
c6911
# 从数组创建DataFrame# 数组(array)
import numpy as np
d = np.array([[1,2,3],[4,5,6],[7,8,9]])
df2 = pd.DataFrame(data = d,index=["a","b","c"],columns=["A","B","C"]
)
df2
ABC
a123
b456
c789

数据查看

import numpy  as np
import pandas as pd
d = np.array([[81,2,34,99],[7,4,5,6],[8,9,5,11],[89,3,5,8],[9,2,34,9]])
df = pd.DataFrame(data =d,columns=list("abcd"))
df
abcd
08123499
17456
289511
389358
492349
# 查看前几行
df.head(2)
abcd
08123499
17456
# 查看后几行
df.tail(2)
abcd
389358
492349
# 随机查看几行
df.sample(2)
abcd
492349
389358
# 按列选取
df["a"]
0    81
1     7
2     8
3    89
4     9
Name: a, dtype: int32

条件查询

d = np.array([[81,2,34,99],[7,4,5,6],[8,9,5,11],[89,3,5,8],[9,2,34,9]])
df = pd.DataFrame(data =d,columns=list("abcd"))
df
abcd
08123499
17456
289511
389358
492349
# 单一条件
df[df["a"]>60]
abcd
08123499
389358
df.loc[df["a"]>60]
abcd
08123499
389358
# 单一条件 & 多列
df.loc[df["a"]>60,["a","b","d"]]
abd
081299
38938
# 多条件
df[(df["a"]>20) & (df["b"]>1)]
abcd
08123499
389358
# 多条件筛选行 & 指定列筛选列
df.loc[(df["a"]>60)&(df["b"]>2),["a","b","d"]]
abd
38938
# 多条件筛选行 & 指定列筛选列
df.loc[(df["a"]>60)&(df["b"]>3),["a","b","d"]]
abd

数学计算

import pandas as pd
import numpy as np
d = np.array([[81,28,24,25,96],[8,35,56,98,39],[13,39,55,36,3],[70,54,69,48,12],[63,80,97,25,70]])
df =pd.DataFrame(data=d,columns=list("abcde"))
df
abcde
08128242596
1835569839
2133955363
37054694812
46380972570

聚合计算

聚合计算:是指对数据进行汇总和统计的操作。常用的聚合计算方法包括计算均值、求和、最大值、最小值、计数等。

df["a"].mean()
47.0
df["a"].sum()
235
df["a"].max()
81
df["a"].min()
8
df["a"].count()
5
df["a"].median() # 中位数
63.0
df["a"].var() # 方差
1154.5
df["a"].skew()  # 偏度
-0.45733193928530436
df["a"].kurt() # 峰度
-2.9999915595685325
df["a"].cumsum() # 累计求和
0     81
1     89
2    102
3    172
4    235
Name: a, dtype: int32
df["a"].cumprod() # 累计求积
0          81
1         648
2        8424
3      589680
4    37149840
Name: a, dtype: int32
df["a"].diff() # 差分
0     NaN
1   -73.0
2     5.0
3    57.0
4    -7.0
Name: a, dtype: float64
df["a"].mad() # 平均绝对值
29.2

按行、列聚合计算

df.sum(axis=0)  # 按列汇总求和
a    235
b    236
c    301
d    232
e    220
dtype: int64
df.sum(axis=1) # 按行汇总求和
0    254
1    236
2    146
3    253
4    335
dtype: int64
df.describe() # 描述性统计
abcde
count5.0000005.0000005.0000005.0000005.000000
mean47.00000047.20000060.20000046.40000044.000000
std33.97793420.65671826.39507530.36939239.083244
min8.00000028.00000024.00000025.0000003.000000
25%13.00000035.00000055.00000025.00000012.000000
50%63.00000039.00000056.00000036.00000039.000000
75%70.00000054.00000069.00000048.00000070.000000
max81.00000080.00000097.00000098.00000096.000000

agg函数

对整个DataFrame批量使用多个聚合函数

df.agg(["sum","mean","max","min","median"]) # 默认按照列
abcde
sum235.0236.0301.0232.0220.0
mean47.047.260.246.444.0
max81.080.097.098.096.0
min8.028.024.025.03.0
median63.039.056.036.039.0
df.agg(["sum","mean","max","min","median"],axis=1)
summeanmaxminmedian
0254.050.896.024.028.0
1236.047.298.08.039.0
2146.029.255.03.036.0
3253.050.670.012.054.0
4335.067.097.025.070.0

对DataFrame的某些列应用不同的聚合函数

df.agg({"a":["max","min"],"b":["sum","mean"],"c":["median"]})
abc
max81.0NaNNaN
min8.0NaNNaN
sumNaN236.0NaN
meanNaN47.2NaN
medianNaNNaN56.0

apply、applymap、map函数

注:applymap函数在新版已被弃用,这里的案例是基于pandas==1.3.2写的

在Python 中如果想要对数据使用函数,可以借助apply(),applymap(),map()对数据进行转换,括号里面可以是直接函数式,或者自定义函数(def)或者匿名函数(lambda)

1、当我们要对数据框(DataFrame)的数据进行按行或按列操作时用apply()

df.apply(lambda x:x.max()-x.min(),axis=1)  # axis=1 对行数据进行操作
0    72
1    90
2    52
3    58
4    72
dtype: int64
df.apply(lambda x:x.max()-x.min(),axis=0)  # axis=0 对列数据进行操作
a    73
b    52
c    73
d    73
e    93
dtype: int64

2、当我们要对数据框(DataFrame)的每一个数据进行操作时用applymap(),返回结果是DataFrame格式

df.applymap(lambda x:1 if x>60 else 0)  # applymap() 对每一个数据进行操作
abcde
010001
100010
200000
310100
411101

3、当我们要对Series的每一个数据进行操作时用map()

df["a"].map(lambda x : 1 if x >60 else 0)
0    1
1    0
2    0
3    1
4    1
Name: a, dtype: int64

总结

apply() 函数可以在DataFrame或Series上用自定义函数,可以在行或者列上进行操作。

applymap()函数只适用于DataFrame,可以在每个元素上应用自定义函数。

map()函数只适用于Series,用于将每个元素映射到另一个值。

pandas合并连接

在pandas中,有很多种方法可以合并和拼接数据。常见的方法包括:append()、concat()、merge()。

追加(Append)

append()函数用于将一个DataFrame或Series对象追加到另一个DataFrame中。

import pandas as pd
df1 = pd.DataFrame({"A":["a","b"],"B":[1,2]
})
df1
AB
0a1
1b2
df2 = pd.DataFrame({"A":["b","c","d"],"B":[2,3,4]
})
df2
AB
0b2
1c3
2d4
df1.append(df2,ignore_index=True)
C:\Users\Alwen\AppData\Local\Temp\ipykernel_2976\2717680053.py:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.df1.append(df2,ignore_index=True)
AB
0a1
1b2
2b2
3c3
4d4

合并(Concat)

concat()函数用于沿指定轴将多个对象(比如Series、DataFrame)堆叠在一起。可以沿行或列方向进行拼接。

# 上下堆叠的例子
df1 = pd.DataFrame({"A":["a","b"],"B":[1,2]
})
df1
AB
0a1
1b2
df2 = pd.DataFrame({"A":["b","c","d"],"B":[2,3,4]
})
df2
AB
0b2
1c3
2d4
pd.concat([df1,df2],axis=0) # 上下拼接 按照列进行拼接
AB
0a1
1b2
0b2
1c3
2d4
# 左右堆叠的列子
df1 = pd.DataFrame({"A":["a","b"]})
df1
A
0a
1b
df2 = pd.DataFrame({"B":[1,2],"C":[3,4]
})
df2
BC
013
124
pd.concat([df1,df2],axis=1)  # 左右拼接  按照行拼接
ABC
0a13
1b24

连接(Merge)

merge()函数用于根据一个或多个键将两个DataFrame的行连接起来。类似SQL中的JOIN操作。

数据连接1(pd.merge)

inner 和 outer连接
df1 = pd.DataFrame({"A":["a","b","c"],"B":[1,2,3]
})
df1
AB
0a1
1b2
2c3
df2 = pd.DataFrame({"A":["b","c","d"],"B":[2,3,4]
})
df2
AB
0b2
1c3
2d4
pd.merge(df1,df2,how="inner")
AB
0b2
1c3
pd.merge(df1,df2,how="outer")
AB
0a1
1b2
2c3
3d4

数据连接2(pd.merge)

左右连接 left right
df1 = pd.DataFrame({"A":["a","b","c"],"B":[1,2,3]
})
df1
AB
0a1
1b2
2c3
df2 = pd.DataFrame({"A":["b","c","d"],"C":[2,3,4]
})
df2
AC
0b2
1c3
2d4
pd.merge(df1,df2,how = "left",on="A") # 左连接
ABC
0a1NaN
1b22.0
2c33.0
pd.merge(df1,df2,how="right",on="A")  # 右连接
ABC
0b2.02
1c3.03
2dNaN4
pd.merge(df1,df2,how="inner",on="A") # 内连接
ABC
0b22
1c33
pd.merge(df1,df2,how="outer",on = "A") # 外连接
ABC
0a1.0NaN
1b2.02.0
2c3.03.0
3dNaN4.0

补充1个小技巧

df1[df1["A"].isin(df2["A"])]  # 返回在df1中列"A"的值在df2中国也存在的行
AB
1b2
2c3
df1[~df1["A"].isin(df2["A"])] # 返回在df1中列"A"的值在df2中不存在的行
AB
0a1

pandas分组聚合

分组聚合(group by)顾名思义就是分2步:

1.先分组:根据某列数据的值进行分组。用groupby()对某列进行分组。

2.后聚合:将结果应用聚合函数进行计算。在agg()函数里应用聚合函数被计算结果。如:sum()、mean()、count()、max()、min()等,用于对每个分组进行聚合计算。


import pandas as pd
import numpy as np
import random
df = pd.DataFrame({"A":["a","b","a","b","a","b"],"B":["L","L","M","N","M","M"],"C":[107,177,139,3,52,38],"D":[22,59,38,50,60,82]
})
df
ABCD
0aL10722
1bL17759
2aM13938
3bN350
4aM5260
5bM3882
单列分组

1.对单列分组后应用sum聚合函数

df.groupby("A").sum()
CD
A
a298120
b218191

2.对单列分组后应用单个指定的聚合函数

df.groupby("A").agg({"C":"min",}).rename(columns={"C":"C_min"})
C_min
A
a52
b3

3.对单列分组后应用多个指定的聚合函数

df.groupby("A").agg({"C":"max","D":"min"}).rename(columns={"C":"C_max","D":"D_min"})
C_maxD_min
A
a13922
b17750

两列分组

1.对多列分组后应用sum聚合函数

df.groupby(["A","B"]).sum()
CD
AB
aL10722
M19198
bL17759
M3882
N350

2.对两列进行group后,都应用max聚合函数

df.groupby(["A","B"]).agg({"C":"max"}).rename(columns={"C":"C_max"})
C_max
AB
aL107
M139
bL177
M38
N3

3.对两列进行分组group后,应用max、min聚合函数。

df.groupby(["A","B"]).agg({"C":"max","D":"min"}).rename(columns={"C":"C_MAX","D":"D_MIN"})
C_MAXD_MIN
AB
aL10722
M13938
bL17759
M3882
N350

补充1:应用自定义的聚合函数

df = pd.DataFrame({"A":["a","b","a","b","a","b"],"B":["L","L","M","N","M","M"],"C":[107,177,139,3,52,38],"D":[22,59,38,50,60,82]
})
df
ABCD
0aL10722
1bL17759
2aM13938
3bN350
4aM5260
5bM3882
## 使用自定义的聚合函数计算每个分组的最大值和最小值
def custom_agg(x):return x.max() - x.min()result = df[["B","C"]].groupby("B").agg({"C":custom_agg})
result
C
B
L70
M101
N0

补充2:开窗函数(类似于SQL里面的over partition by):

使用transform函数计算每个分组的均值

# 使用transform函数计算每个分组的均值
df["B_C_std"] = df[["B","C"]].groupby("B")["C"].transform("mean")
df
ABCDB_C_std
0aL10722142.000000
1bL17759142.000000
2aM1393876.333333
3bN3503.000000
4aM526076.333333
5bM388276.333333

补充3:分组聚合拼接字符串pandas实现类似group_concat功能

df = pd.DataFrame({"姓名":["张三","张三","张三","李四","李四","李四"],"科目":["语文","数学","英语","语文","数学","英语"]
})
df
姓名科目
0张三语文
1张三数学
2张三英语
3李四语文
4李四数学
5李四英语

补充:按某列分组,将另一列文本拼接合并

按名称分组,把每个人的科目拼接到一个字符串

# 对整个group对象中的所有列应用join连接元素
(df.astype(str) # # 先将数据全转为字符
.groupby("姓名") #分组
.agg(lambda x : ",".join(x)))[["科目"]] # join 连接元素
科目
姓名
张三语文,数学,英语
李四语文,数学,英语

pandas 数据重塑

数据重塑,顾名思义就是给数据做各种变形,主要有以下几种:

1.df.pivot 数据变形

2.df.pivot_table 数据透视表

3.df.stack/unstack 数据堆叠

4.df.melt 数据融合

5.df.cross 数据交叉表

df.pivot 数据变形

根据索引(index)、列(column)(values)值,对原有DataFrame(数据框)进行变形重塑,俗称长表转宽表

import pandas as pd
import numpy as np
df = pd.DataFrame({"姓名":["张三","张三","张三","李四","李四","李四"],"科目":["语文","数学","英语","语文","数学","英语"],"成绩":[91,80,100,80,100,96]
})
df
姓名科目成绩
0张三语文91
1张三数学80
2张三英语100
3李四语文80
4李四数学100
5李四英语96
# 长转宽:使用df.pivot以姓名为index,以各科目为columns,来统计各科成绩:df.pivot(index = "姓名",columns="科目",values="成绩")
科目数学英语语文
姓名
张三8010091
李四1009680

pd.melt() 数据融合

df1 = pd.pivot(df,index="姓名",columns="科目",values="成绩").reset_index()
df1
科目姓名数学英语语文
0张三8010091
1李四1009680
# 宽表变长表:使用pd.melt以姓名为标识变量的列id_var,以各科目为value_vars,来统计各科成绩df1.melt(id_vars=["姓名"],value_vars=["语文","数学","英语"])
姓名科目value
0张三语文91
1李四语文80
2张三数学80
3李四数学100
4张三英语100
5李四英语96

pd.pivot_table() 数据透视表

import random
random.seed(1024)
df = pd.DataFrame({"专业":np.repeat(["数学与应用数学","计算机","统计学"],4),"班级":["1班","1班","2班","2班"]*3,"科目":["高数","线代"]*6,"平均分":[random.randint(60,100) for i in range(12)],"及格人数":[random.randint(30,50) for i in range(12)]
})
df
专业班级科目平均分及格人数
0数学与应用数学1班高数8533
1数学与应用数学1班线代6243
2数学与应用数学2班高数9550
3数学与应用数学2班线代8740
4计算机1班高数6150
5计算机1班线代7244
6计算机2班高数10045
7计算机2班线代6032
8统计学1班高数7449
9统计学1班线代6636
10统计学2班高数7546
11统计学2班线代9939

各个专业对应科目的及格人数和平均分

pd.pivot_table(df,index =["专业","科目"],values = ["及格人数","平均分"],aggfunc={"及格人数":np.sum,"平均分":"mean"})
及格人数平均分
专业科目
数学与应用数学线代8374.5
高数8390.0
统计学线代7582.5
高数9574.5
计算机线代7666.0
高数9580.5
补充说明

df.pivot_table()和df.pivot()都是Pandas中用于将长表转换为宽表的方法,但是它们在使用方式和功能上有一些区别。

1.使用方式:

df.pivot()方法接受三个参数:index、columns和values,分别指定新表的索引、列和值。

df.pivot_table()方法接受多个参数,其中最重要的是index、columns和values,用于指定新表的索引、列和值。此外,还可以使用aggfunc参数指定对重复值进行聚合操作的函数,默认为均值。

2.处理重复值:

df.pivot()方法在长表中存在重复值时会引发错误。因此,如果长表中存在重复值,就需要先进行去重操作,或者使用其他方法来处理重复值。

df.pivot_table()方法可以在长表中存在重复值的情况下进行透视操作,并可以使用aggfunc参数指定对重复值进行聚合操作的函数,默认为均值。

3.聚合操作:

df.pivot()方法不支持对重复值进行聚合操作,它只是简单地将长表中的数据转换为宽表。

df.pivot_table()方法支持对重复值进行聚合操作。可以使用aggfunc参数来指定聚合函数,例如求均值、求和、计数等。

总的来说,df.pivot()方法适用于长表中不存在重复值的情况,而df.pivot_table()方法适用于长表中存在重复值的情况,并且可以对重复值进行聚合操作。根据具体的数据结构和分析需求,选择合适的方法进行转换操作。

数据堆叠(Stack/Unstack)

import pandas  as pd
import numpy as np
import random
df = pd.DataFrame({"专业":np.repeat(["数学与应用数学","计算机","统计学","物理学"],6),"班级":["1班","2班","3班"]*8,"科目":["高数","线代"]*12,"平均分":[random.randint(60,100) for i in range(24)],"及格人数":[random.randint(30,50) for i in range(24)]})
df2 = pd.pivot_table(df,index=["专业","科目"],values = ["及格人数","平均分"],aggfunc={"及格人数":np.sum , "平均分":np.mean})
df2
及格人数平均分
专业科目
数学与应用数学线代10682.333333
高数10581.333333
物理学线代13284.666667
高数11987.666667
统计学线代11084.000000
高数11585.333333
计算机线代12185.333333
高数10984.666667
stacked  = df2.stack()
专业       科目      
数学与应用数学  线代  及格人数    106.000000平均分      82.333333高数  及格人数    105.000000平均分      81.333333
物理学      线代  及格人数    132.000000平均分      84.666667高数  及格人数    119.000000平均分      87.666667
统计学      线代  及格人数    110.000000平均分      84.000000高数  及格人数    115.000000平均分      85.333333
计算机      线代  及格人数    121.000000平均分      85.333333高数  及格人数    109.000000平均分      84.666667
dtype: float64

“压缩”后的DataFrame或Series(具有MultiIndex作为索引),stack()的逆操作是unstack(),默认情况下取消最后压缩的那个级别:堆叠stack(),顾名思义就是把透视结果到一起。接下来我们把透视后堆叠的数据一步步展开unstack():

stacked.unstack()
及格人数平均分
专业科目
数学与应用数学线代106.082.333333
高数105.081.333333
物理学线代132.084.666667
高数119.087.666667
统计学线代110.084.000000
高数115.085.333333
计算机线代121.085.333333
高数109.084.666667
stacked.unstack(level=1)
科目线代高数
专业
数学与应用数学及格人数106.000000105.000000
平均分82.33333381.333333
物理学及格人数132.000000119.000000
平均分84.66666787.666667
统计学及格人数110.000000115.000000
平均分84.00000085.333333
计算机及格人数121.000000109.000000
平均分85.33333384.666667
stacked.unstack(level=0)
专业数学与应用数学物理学统计学计算机
科目
线代及格人数106.000000132.000000110.000000121.000000
平均分82.33333384.66666784.00000085.333333
高数及格人数105.000000119.000000115.000000109.000000
平均分81.33333387.66666785.33333384.666667

数据交叉表(pd.crosstab)

交叉表显示了每个变量的不同类别组合中观察到的频率或计数。通俗的说,就是根据不同列的数据统计了频数。

df = pd.DataFrame({"High":["高","高","高","中","中","中","低","低","低","高","低"],"Weight":["重","轻","中","中","轻","重","重","轻","中","重","轻"]
})
df
HighWeight
0
1
2
3
4
5
6
7
8
9
10
pd.crosstab(df["High"],df["Weight"])
Weight
High
111
121
112

双层crosstab

df = pd.DataFrame({"High":["高","高","高","中","中","中","低","低","低","高","低"],"Weight":["重","轻","中","中","轻","重","重","轻","中","重","轻"],"Size":["大","中","小","中","中","大","中","小","小","大","小"]
})
df
HighWeightSize
0
1
2
3
4
5
6
7
8
9
10
pd.crosstab(df["High"],[df["Size"],df["Weight"]],rownames=["High"],colnames=["Size","Weight"])
Size
Weight
High
110100
001012
010210

另一种 宽表转长表 pd.wide_to_long()

np.random.seed(123)df = pd.DataFrame({"A1970":{0:"a",1:"b",2:"c"},"A1980":{0:"d",1:"e",2:"f"},"B1970":{0:2.5,1:1.2,2:0.7},"B1980":{0:3.2,1:1.3,2:0.1},"X":dict(zip(range(3),np.random.randn(3)))
})
df["id"] = df.index
df
A1970A1980B1970B1980Xid
0ad2.53.2-1.0856310
1be1.21.30.9973451
2cf0.70.10.2829782

把id列用作标识列

pd.wide_to_long(df,["A","B"],i="id",j="year")
XAB
idyear
01970-1.085631a2.5
119700.997345b1.2
219700.282978c0.7
01980-1.085631d3.2
119800.997345e1.3
219800.282978f0.1
df = pd.DataFrame({"famid":[1,1,1,2,2,2,3,3,3],"birth":[1,2,3,1,2,3,1,2,3],"ht1":[2.8,2.9,2.2,2,1.8,1.9,2.2,2.3,2.1],"ht2":[3.4,3.8,2.9,3.2,2.8,2.4,3.3,3.4,2.9]
})
df
famidbirthht1ht2
0112.83.4
1122.93.8
2132.22.9
3212.03.2
4221.82.8
5231.92.4
6312.23.3
7322.33.4
8332.12.9

把 famid,birth两列作为标识列

l = pd.wide_to_long(df,stubnames="ht",i = ["famid","birth"],j="age")
l
ht
famidbirthage
1112.8
23.4
212.9
23.8
312.2
22.9
2112.0
23.2
211.8
22.8
311.9
22.4
3112.2
23.3
212.3
23.4
312.1
22.9

pandas 文本数据

import pandas as pd

1.cat()拼接字符串

d = pd.DataFrame(["a","b","c"],columns=['A'])
d
A
0a
1b
2c

将某列元素拼接一列特定字符串

d["A"].str.cat(["A","B","C"],sep=",")
0    a,A
1    b,B
2    c,C
Name: A, dtype: object

将某列的元素合并为一个字符串

d["A"].str.cat(sep=",")
'a,b,c'

2.split()切分字符串

import numpy as np
import pandas as pd
d = pd.DataFrame(["a_b_c","c_d_e",np.nan,"f_g_h"],columns=["A"])
d
A
0a_b_c
1c_d_e
2NaN
3f_g_h

将某列的字符串元素进行切分

d["A"].str.split("_")
0    [a, b, c]
1    [c, d, e]
2          NaN
3    [f, g, h]
Name: A, dtype: object

3.get()获取指定位置的字符串

d = pd.DataFrame(["a_b_c","c_d_e",np.nan,"f_g_h"],columns=["A"])
d
A
0a_b_c
1c_d_e
2NaN
3f_g_h
d["A"].get(3)
'f_g_h'

4.join()对每个字符都用给定的字符串拼接起来(不常用)

d = pd.DataFrame(["a_b_c","c_d_e",np.nan,"f_g_h"],columns=["A"])
d
A
0a_b_c
1c_d_e
2NaN
3f_g_h
d["A"].str.join("!")
0    a!_!b!_!c
1    c!_!d!_!e
2          NaN
3    f!_!g!_!h
Name: A, dtype: object

5.contains()是否包含表达式(很常用)

d["A"].str.contains("d")
0    False
1     True
2      NaN
3    False
Name: A, dtype: object
d.fillna("0")[d.fillna("0")["A"].str.contains("d")]
A
1c_d_e

表示或的关系用"A|B",表示且用"A.B"|"B.A"

d.fillna("0")[d.fillna("0")["A"].str.contains("c|d")]
A
0a_b_c
1c_d_e

6. replace()替换

d["A"].str.replace("_",",")
0    a,b,c
1    c,d,e
2      NaN
3    f,g,h
Name: A, dtype: object

7.repeat()重复

d["A"].str.repeat(3)
0    a_b_ca_b_ca_b_c
1    c_d_ec_d_ec_d_e
2                NaN
3    f_g_hf_g_hf_g_h
Name: A, dtype: object

8. pad()左右补齐

d["A"].str.pad(10,fillchar="*")
0    *****a_b_c
1    *****c_d_e
2           NaN
3    *****f_g_h
Name: A, dtype: object
d["A"].str.pad(10,side="right",fillchar="&")
0    a_b_c&&&&&
1    c_d_e&&&&&
2           NaN
3    f_g_h&&&&&
Name: A, dtype: object

9.center()中间补齐

d["A"].str.center(10,fillchar="?")
0    ??a_b_c???
1    ??c_d_e???
2           NaN
3    ??f_g_h???
Name: A, dtype: object

10.ljust()右边补齐

d["A"].str.ljust(10,fillchar="?")
0    a_b_c?????
1    c_d_e?????
2           NaN
3    f_g_h?????
Name: A, dtype: object

11.rjsut()左边补齐

d["A"].str.rjust(10,fillchar="?")
0    ?????a_b_c
1    ?????c_d_e
2           NaN
3    ?????f_g_h
Name: A, dtype: object

12.zfill()左边补0

d["A"].str.zfill(10)
0    00000a_b_c
1    00000c_d_e
2           NaN
3    00000f_g_h
Name: A, dtype: object

13.wrap()在指定的位置加回车符号

d["A"].str.wrap(3)
0    a_b\n_c
1    c_d\n_e
2        NaN
3    f_g\n_h
Name: A, dtype: object

14.slice()按给定点的开始结束位置切割字符串

d["A"].str.slice(1,3)
0     _b
1     _d
2    NaN
3     _g
Name: A, dtype: object

15.slice_repalce()使用给定的字符串,替换指定的位置的字符

d["A"].str.slice_replace(1,3,"?")
0    a?_c
1    c?_e
2     NaN
3    f?_h
Name: A, dtype: object
d["A"].str.slice_replace(0,3,"?")
0    ?_c
1    ?_e
2    NaN
3    ?_h
Name: A, dtype: object

16.count()计算给定单词出现的次数

d["A"].str.count("b")
0    1.0
1    0.0
2    NaN
3    0.0
Name: A, dtype: float64

17.startswith()判断是否以给定的字符串开头

d["A"].str.startswith("a")
0     True
1    False
2      NaN
3    False
Name: A, dtype: object

18.endswith()判断是否以给定的字符串结束

d["A"].str.endswith("e")
0    False
1     True
2      NaN
3    False
Name: A, dtype: object

19.findall()查找所有符合正则表达式的字符,以数组形式返回

d["A"].str.findall("[a-z]")
0    [a, b, c]
1    [c, d, e]
2          NaN
3    [f, g, h]
Name: A, dtype: object

20.match()检测是否全部匹配给定的字符串或表达式

d["A"].str.match("[d-z]")
0    False
1    False
2      NaN
3     True
Name: A, dtype: object

21.extact()抽取匹配的字符串出来,注意要加上括号,把你需要抽取的东西标注上

d["A"].str.extract("([d-z])")
0
0NaN
1d
2NaN
3f

22.len()计算字符串的长度

d["A"].str.len()
0    5.0
1    5.0
2    NaN
3    5.0
Name: A, dtype: float64

23.strip()去除前后的空白字符

df = pd.DataFrame(["a_b ","d_e ",np.nan,"f_g  "],columns=["B"])
df
B
0a_b
1d_e
2NaN
3f_g
df["B"].str.strip()
0    a_b
1    d_e
2    NaN
3    f_g
Name: B, dtype: object

24.rstrip()去除后面的空白字符

df["B"].str.rstrip()
0    a_b
1    d_e
2    NaN
3    f_g
Name: B, dtype: object

25.lstrip()去除前面的空白字符

df["B"].str.lstrip()
0     a_b 
1     d_e 
2      NaN
3    f_g  
Name: B, dtype: object

26.partition()把字符串数组切割成为DataFrame,注意切割只是切割称为三部分,分隔符前,分隔符,分隔符后

d["A"].str.partition("_")
012
0a_b_c
1c_d_e
2NaNNaNNaN
3f_g_h

27.rpartition()从右切起

d["A"].str.rpartition("_")
012
0a_b_c
1c_d_e
2NaNNaNNaN
3f_g_h

28.lower()全部小写

d["A"].str.lower()
0    a_b_c
1    c_d_e
2      NaN
3    f_g_h
Name: A, dtype: object

29.upper()全部大写

d["A"].str.upper()
0    A_B_C
1    C_D_E
2      NaN
3    F_G_H
Name: A, dtype: object

30.find()从左边开始,查找给定字符串的所在位置

d["A"].str.find("d")
0   -1.0
1    2.0
2    NaN
3   -1.0
Name: A, dtype: float64

31.rfind()从右边开始,查找给定字符串的所在位置

d["A"].str.rfind("c")
0    4.0
1    0.0
2    NaN
3   -1.0
Name: A, dtype: float64

32.index()查找给定字符串的位置,注意,如果不存在这个字符串,那么会报错

d["A"].str.index("_")
0    1.0
1    1.0
2    NaN
3    1.0
Name: A, dtype: float64

33.rindex()从右边开始查找,给定字符串的位置

d["A"].str.rindex("_")
0    3.0
1    3.0
2    NaN
3    3.0
Name: A, dtype: float64
d["A"].str.rindex("_")
0    3.0
1    3.0
2    NaN
3    3.0
Name: A, dtype: float64

34.capitalize()首字符大写

d["A"].str.capitalize()
0    A_b_c
1    C_d_e
2      NaN
3    F_g_h
Name: A, dtype: object

35.swapcase() 大小写互换

d["A"].str.capitalize().str.swapcase()
0    a_B_C
1    c_D_E
2      NaN
3    f_G_H
Name: A, dtype: object

36.isalnum()是否全部是数字和字母组成

d["A"].str.isalnum()
0    False
1    False
2      NaN
3    False
Name: A, dtype: object

37.isalpha()是否全部是字母

d["A"].str.isalpha()
0    False
1    False
2      NaN
3    False
Name: A, dtype: object

38.isdigit()是否全部都是数字

d["A"].str.isdigit()
0    False
1    False
2      NaN
3    False
Name: A, dtype: object

39.isspace()是否为空格

d["A"].str.isspace()
0    False
1    False
2      NaN
3    False
Name: A, dtype: object

40.islower()是否全部小写

d["A"].str.islower()
0    True
1    True
2     NaN
3    True
Name: A, dtype: object

41.isupper()是否全部大写

d["A"].str.isupper()
0    False
1    False
2      NaN
3    False
Name: A, dtype: object

42.istitle()是否只有首字母为大写,其他字母为小写

d["A"].str.istitle()
0    False
1    False
2      NaN
3    False
Name: A, dtype: object

43.isnumeric()是否是数字

d["A"].str.isnumeric()
0    False
1    False
2      NaN
3    False
Name: A, dtype: object

44.isdecimal()是否全部是数字

d["A"].str.isdecimal()
0    False
1    False
2      NaN
3    False
Name: A, dtype: object

pandas 时序数据



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889689.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

06 常用损失函数介绍

在前文中我们使用的损失函数都是均方误差(MSE,Mean Squared Error),本篇介绍一些其他的损失函数形式,以及他们的不同用途。 1. 回归任务常用损失函数 1.1 均方误差(MSE, Mean Squared Error) 均方误差(MSE)是回归任务中最常用的损失函数之一,用于衡量模型预测值与真实…

啦啦啦啦啦啦啦啦啦

啦啦啦 啦啦啦啦啦啦啦啦啦 ABC221G 神秘题,将坐标轴转 \(45\),然后 bitset 优化背包,记录路径把刚刚被更新的找出来,然后 _Find_next,每个点只会记一次。 AGC050a 神秘题,想到 \(\log\),然后发现一下位置 \(x\) 走十次能到的区间是 \([1024x,1024x+1023]\),区间长度够…

破解 vLLM + DeepSeek 规模化部署的“不可能三角”

通过 FC GPU 预留实例的闲置计费功能,企业用户能在充分利用 vLLM 的强大功能的同时找到成本、性能、稳定的最佳平衡点,并保持开发和运维的高效性。无论是将 FC vLLM 函数直接对外提供服务,还是深度集成到现有系统中,或是通过 CAP 还是魔搭来简化部署,都能找到满足您业务需…

条形码编码规则全解析:从黑白条纹到数字世界的转换密码

条形码的编码规则是将字符(数字、字母等)转换为特定黑白条纹或矩阵结构的标准化方法,核心目的是让机器能够快速、准确地识别和解析信息。以下是常见条形码编码规则的简介: 一维条形码编码规则 1. ​基本原理通过不同宽度的黑白条纹​(或空格)组合表示字符。 每个字符对应…

[汽车电子/车联网] CANoe

概述:CANoe CAN 全家桶区别: CANoe vs CanalyzerCANoe和CANalyzer使用方法类似(简直可以说 相同)。 都可用于simulation,区别在于CANalyzer只能模拟单个Node,而CANoe可以同时模拟多个Node。如果入门学习了CANoe,就不用入门学习CANalyzer了。安装指南 安装 CANoeDemo on …

璞华易研PLM荣登软服之家多项榜单,PLM+AI为流程行业提供产品创新引擎

近日,国内知名软件与服务评测平台软服之家发布了多个PLM(Product Lifecycle Management,产品全生命周期管理)榜单,帮助用户了解PLM领域表现卓越的软件产品和服务。在软服之家的多项榜单中,璞华易研PLM凭借其自主研发能力与行业深耕优势,在流程行业、电子信息、装备制造等…

ELK 原理介绍及实践详解

介绍了ELK(Elasticsearch, Logstash, Kibana)在大规模日志管理中的重要性,阐述了ELK解决日志分析的挑战,如日志收集、传输、存储和分析。文章详细讲解了ELK的组成部分,包括Filebeat的工作原理、Logstash的输入、过滤和输出阶段,以及Kibana的分析和可视化功能。此外,还提…

工信部人才交流中心PostgreSQL认证考试 - 聊一下更多精彩

在数字经济高速发展的今天,数据库作为信息基础设施的核心组件,其技术自主性与人才储备已成为国家战略竞争力的关键。工业和信息化部人才交流中心(以下简称“工信人才”)推出PostgreSQL认证考试,不仅是对技术发展趋势的精准响应,更是推动信创产业生态建设、填补数据库人才缺…

单链表与单循环链表的C语言实现

单链表与单循环链表的C语言实现 目录单链表与单循环链表的C语言实现单链表的增删查改单循环链表的增删查改 单链表的增删查改 /*单链表*/#include<stdio.h> #include<stdlib.h>typedef struct Node{int data;struct Node* next; }Node;Node* initList(){Node* node…

可能是全球最快捷的修改hosts文件方式

使用快捷方式一键修改hosts文件。 下面请看VCR:其实关键的命令只有一条:powershell.exe -Command "Start-Process -FilePath notepad.exe -Verb RunAs -ArgumentList "$env:SystemRoot\system32\drivers\etc\hosts""它使用记事本以管理员权限打开位于 C:…

KUKA机器人KR70伺服电机力矩不足维修攻略

库卡机器人作为先进的工业自动化解决方案,广泛应用于各种生产线中。然而,当出现KUKA机械手伺服马达力矩不足干燥的问题时,可能会严重影响其工作效率和性能。 一、库卡机器人电机力矩不足故障的原因 1. 电机老化:随着使用时间的增加,电机内部的零部件可能会出现磨损,导致力…

S2-防护-战士Warrior-团体-大秘境-专精-天赋-配装-宏

S2毕业装--属性 急速>全能>爆击>精通 急速和全能越高越好。爆击和精通随缘。 --团本天赋(更新时间2月5日)--团本天赋代码 CkEAmidFBOBFf5oKuZ7r/WeW7YEDAAAAzMzYmZGMbzsMzMz2mZMMNzgZmBwyADbMzMwDMzDMMAAAAAAgZGAgltNADDsBLLGNmBwsFbYD --大秘天赋(更新时间2月5日)--大…