“Pandas数据处理与分析:实用技巧与应用“

news2024/9/22 23:31:56

目录

# 开篇

1. pandas的series的了解

1.1 pd.Series 创建

1.2 pd.series 的索引使用

1.3 pd.series 之字典/索引

1.4 pandas 转换数据类型

1.5 pandas 通过索引或者通过位置来取值

1.6 pandas 指定行取值

1.7 pands之Series 切片和索引

1.8 pands之Series 的索引和值

2. pandas读取外部数据/sql/mongodb

2.1 read_csv 读取csv文件

3. pandas的dataFrame的创建

3.1 pd.DataFrame 的创建

3.2 DataFrame指定行索引,指定列索引

3.3 DataFrame切片操作

3.4 字典转成DataFrame

4. Dataframe的描述信息

4.1 sort_values 排序

4.2 指定前2名排序

5. dataFrame的索引

5.1 t[:5]

5.2 t["W"]

5.3 loc & iloc

5.4 t.loc[:, "Y"]

5.5 t.loc[["a","b"]]

5.6 t.loc[:,["X","Y"]]

5.7 t.loc[["a","b"],["X","Y"]]

5.8 t.iloc[1,:]

5.9 t.iloc[:,2]

5.10 t.iloc[:,[2,1]]

5.11 t.iloc[[0,2],[2,1]]

5.12 t.iloc[1:,:2]

5.13 t.iloc[1:,:2] = np.nan

6. bool索引和缺失数据的处理

6.1 t[(10 < t["W"]) & (t["W"] < 20)]

6.2 t[(6 == t["W"]) | (t["W"] == 9)]

6.3 t2["name"].str.split("/")

6.4 转换数据类型为list列表

6.5 缺失数据的处理

6.6 pd.isnull(t1) & pd.notnull(t1)

6.7 t1[pd.notnull(t1["W"])]

6.8 dropna 删除NaN的行

6.9 t1.fillna(0)

6.10 t1.fillna(t1.mean())

6.11 t1["X"].fillna(t1["X"].mean())

7. pandas中的常用统计方法

描述性统计:

7.1 df.describe()

7.2 df.mean()

7.3 df.median()

7.4 df.std()

7.5 df.var()

7.6 df.min() 和 df.max()

7.7 df.sum()

7.8 df.count()

7.9 df.quantile(q)

聚合和分组统计:

7.10 df.groupby('column').mean()

7.10.1 分组统计案例

7.11 df.groupby('column').agg({'col1': 'mean', 'col2': 'sum'})

7.12 df.pivot_table(values='col1', index='col2', columns='col3', aggfunc='mean')

其他常用统计方法:

7.13 df.corr()

7.14 df.cov()

7.15 df.value_counts()

7.16 df.unique()

7.17 df.nunique()

7.18 df.mode()

# 数据的合并和分组聚合

8. 离散化及其在 Pandas 中的实现方法

9. 数据合并

9.1 t1.join(t2)

9.2 merge方法

9.3 t1.merge(t2, on="B")

9.4 t1.merge(t2, how="outer", on="B")

9.5 how="left" & how="right"

10. 数据分组聚合

11. 数据的索引学习

11.1 index & reindex

11.2 t1.set_index("A")

11.3 t1.set_index("A").index

11.4 t1.set_index("A", drop=False)

11.5 t1["A"].unique()

11.6 a.set_index(["c", "d"]

索引练习:

11.7 b.swaplevel()

11.8 series.Series :索引类型

11.9 frame.DataFrame

11.10 c["one"] & c["one"]["bar"]

11.11 b.loc["one"].loc["bar"]

11.12 b.swaplevel().loc["bar"]


# 开篇

pandas可以读取SQL;pd.read_sql(sql_sentence,connection

类型转换: map(int, a)

  • map是一个 Python 内置函数;
  • map() 的使用示例,用于将一个可迭代对象 a 中的每个元素都应用 int() 函数进行转换;
  • 在 Python 中,a 可以是任何可迭代对象,包括但不限于:
  1. 列表(List): 最常见的可迭代对象之一,包含多个元素的有序集合。
  2. 元组(Tuple): 与列表类似,但元组是不可变的序列。
  3. 集合(Set): 无序且不重复的元素集合。
  4. 字符串(String): 字符的有序集合。
  5. 字典(Dictionary): 包含键值对的集合,map() 可以应用于字典的键或值。

1. pandas的series的了解

  • pandas的使用:

    numpy帮我们处理的是数值型的数据,无法处理除数值型之外的类型,而pandas除了处理数值之外(基于numpy),还能帮我们处理其它类型的数据;

  • pandas的常用数据类型:

    Series一维,带标签数组;

    DataFrame二维,Series容器;

1.1 pd.Series 创建

import pandas as pd
import numpy as np
import string

# t = pd.Series(np.arange(10))
t = pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))  # 创建Series
print(t)
print("*" * 100)
print(type(t))

1.2 pd.series 的索引使用

索引默认0开始;

t = pd.Series([1, 2, 3, 1, 2, 3])
print(type(t))
print(t)

索引默认0开始,但是可以手动指定索引;

t = pd.Series([1, 2, 3, 1, 2, 3], index=list("abcdef"))
print(type(t))
print("*" * 100)
print(t)

1.3 pd.series 之字典/索引

通过字典创建一个Series,其中的索引就是字典的键;

重新给其指定其它索引之后,如果能够对应上,就取其值,如果不能,就为Nan;

temp_dict = {"name": "yiyi", "age": 30, "tel": 1186}
t3 = pd.Series(temp_dict)
print(t3)

1.4 pandas 转换数据类型

temp_dict = {"name": "yiyi", "age": 30, "tel": 1186}
t3 = pd.Series(temp_dict)  # 创建Series
print(t3)
print("*" * 100)

t = pd.Series([1, 2, 3, 1, 2, 3], index=list("abcdef"))
print(t.dtype)
print("*" * 100)
t4 = t.astype(float)  # 转换数据类型
print(t4)
print("*" * 100)
print(t4.dtype)

1.5 pandas 通过索引或者通过位置来取值

temp_dict = {"name": "yiyi", "age": 30, "tel": 1186}
t3 = pd.Series(temp_dict)  # 创建Series

print(t3["name"])  # 根据索引key获取数据
print(t3[0])  # 根据索引下标获取数据

1.6 pandas 指定行取值

temp_dict = {"name": "yiyi", "age": 30, "tel": 1186}
t3 = pd.Series(temp_dict)  # 创建Series
print(t3[:2])  # 获取前2个数据

t3[:2] :代表2前面的所有行被取出;

t3[["key1","key2"]] :根据key取值;

t3[[1, 2]] :根据位置取值;

如果不存在该key,那么取出来的就会是NaN的值;

temp_dict = {"name": "yiyi", "age": 30, "tel": 1186}
t3 = pd.Series(temp_dict)  # 创建Series
print(t3[:2])  # 获取前2个数据
print("*" * 100)
print(t3[[1, 2]])  # 获取指定索引的数据
print("*" * 100)
print(t3[["age", "tel"]])  # 获取指定索引的数据

1.7 pands之Series 切片和索引

切片:直接传入start end或者步长即可;

索引:一个的时候直接传入序号或者index,多个的时候传入序号或者index的列表;

1. t[2:10:2] :从2开始到10结束,步长为2

t = pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))  # 创建Series
print(t)
print("*" * 100)
print(t[2:10:2])  # 从2开始到10结束,步长为2

2. t[[2, 3, 6]] :只获取2,3,6的数据

t = pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))  # 创建Series
print(t)
print("*" * 100)
print(t[[2, 3, 6]])  # 获取指定索引的数据

3. t["F"] :根据key获取数据

t = pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))  # 创建Series
print(t)
print("*" * 100)
print(t["F"])  # 获取指定索引的数据

1.8 pands之Series 的索引和值

  • Series对象本质上有两个数组构成,一个数组构成对象的键(index,索引),一个数组构成对象的值(value)

    键→值

  • ndarray 的很多方法都可以运用于series 类型,比如argmax,clip
  • series 具有where 方法,但是结果和ndarray 不同;
t = pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))  # 创建Series
print(t.index)  # 获取Series的索引
print(type(t.index))  # 获取Series的索引下标类型
print("*" * 100)
print(t.values)  # 获取Series的值
print(type(t.values))  # 获取Series的值类型

各种方法:

list(t.index)[:2] :先获取所有的index,取2前面的所有行

t = pd.Series(np.arange(10), index=list(string.ascii_uppercase[:10]))  # 创建Series
print(type(t.index))  # 获取Series的索引下标类型
print(len(t.index))  # 获取Series的索引下标长度
print(list(t.index))  # 获取Series的索引下标
print(list(t.index)[:2])  # 指定获取Series的索引下标

2. pandas读取外部数据/sql/mongodb

2.1 read_csv 读取csv文件

pd.read_csv("../youyube_video_data/GBvideos-pandas.csv") :读取csv文件

  • 除了cvs文件外,还可以读取SQL,MongoDB的文件内容:
    • from pymongo import MongoClient 导包;
    • pd.Series(t) 读取;
  • 不同列索引的情况下,也不会影响这些数据转成DataFrame:
    • df = pd.DataFrame(data) 转换
df = pd.read_csv("../youyube_video_data/GBvideos-pandas.csv")  # 读取csv文件
print(df)

3. pandas的dataFrame的创建

3.1 pd.DataFrame 的创建

  • DataFrame对象既有行索引,又有列索引:
    • 行索引,表明不同行,横向索引,叫index,0轴,axis=0;
    • 列索引,表明不同列,纵向索引,叫columns,1轴,axis=1;
t = pd.DataFrame(np.arange(12).reshape((3, 4)))
print(t)

3.2 DataFrame指定行索引,指定列索引

t = pd.DataFrame(np.arange(12).reshape((3, 4)), index=list("abc"), columns=list("WXYZ"))
print(t)

3.3 DataFrame切片操作

d1 = {"name": ["yiYi", "zhangSan"], "age": [24, 28], "tel": [1186, 1185]}
print(pd.DataFrame(d1))  # 创建DataFrame

3.4 字典转成DataFrame

d1 = [{"name": "yiYi", "age": 24, "tel": 1186}, {"name": "zhangSan", "age": 28}, {"name": "wangWu", "age": 30}]
print(d1)
print("*" * 100)
print(pd.DataFrame(d1))  # 将列表转换为DataFrame

4. Dataframe的描述信息

  • DataFrame的基础属性:

    df.shape # 行数 列数

    df.dtypes # 列数据类型

    df.ndim # 数据维度

    df.index # 行索引

    df.columns # 列索引

    df.values # 对象值,二维ndarray数组

  • DataFrame整体情况查询:

    df.head(3) # 显示头部几行,默认5

    df.tail(3) # 显示末尾几行,默认5行

    df.info() # 相关信息概览:行数,列数,列索引,列非空值个数,列类型,内存占用

    df.describe() # 快速综合统计结果:计数,均值,标准差,最大值,四分位数,最小值

4.1 sort_values 排序

df.sort_values(by="W", ascending=False) :排序,by 指定行索引,ascending=False 降序排序

t = pd.DataFrame(np.arange(12).reshape((3, 4)), index=list("abc"), columns=list("WXYZ"))
t[2:] = 1
print(t)
print("*" * 100)
t1 = t.sort_values(by="W")  # 根据W升序排查
print(t1)
print("*" * 100)
t2 = t.sort_values(by="W", ascending=False)  # 根据W降序排查
print(t2)

4.2 指定前2名排序

t = pd.DataFrame(np.arange(12).reshape((3, 4)), index=list("abc"), columns=list("WXYZ"))
t[2:] = 1
print(t)
print("*" * 100)
df = t.sort_values(by="W", ascending=False)
print(df.head(2))  # 获取前2个数据

5. dataFrame的索引

  • 注意事项:

    方括号写数字,表示取行,对行进行操作;

    字符串,表示的去列索引,对列进行操作;

5.1 t[:5]

t[:5] :取前5行数据

t = pd.DataFrame(np.arange(24).reshape((8, 3)), columns=list("WXY"))
t[2:] = 1
print(t)
print("*" * 100)
# 取前5行数据
print(t[:5])

5.2 t["W"]

t["W"] :指定列获取

t = pd.DataFrame(np.arange(24).reshape((8, 3)), columns=list("WXY"))
t[2:] = 1
print(t)
print("*" * 100)
# 指定列获取
print(t["W"])

5.3 loc & iloc

  • loc & iloc

    t.loc[0, "Y"] :获取指定行和列的数据

    t.loc[0] & t.loc[0, :] :取出指定行的数据

pandas 之loc :

  1. df.loc 通过标签索引行数据;
  2. df.iloc 通过位置获取行数据;
t = pd.DataFrame(np.arange(24).reshape((8, 3)), columns=list("WXY"))
t[2:] = 1
print(t)
print("*" * 100)
print(t.loc[0, "Y"])  # 获取指定行和列的数据
print(type(t.loc[0, "Y"]))  # 获取指定行和列的数据类型
print("*" * 100)
print(t.loc[0])  # 取出指定行的数据
print(t.loc[0, :])  # 取出指定行的数据

5.4 t.loc[:, "Y"]

t.loc[:, "Y"] :取出指定列的数据

t = pd.DataFrame(np.arange(24).reshape((8, 3)), columns=list("WXY"))
print(t)
print("*" * 100)
print(t.loc[:, "Y"])  # 取出指定列的数据

t.loc[] :取多行多列:

5.5 t.loc[["a","b"]]

t.loc[["a","b"]] :取a,b行

t = pd.DataFrame(np.arange(24).reshape((8, 3)), index=list("abcdefgh"), columns=list("WXY"))
print(t)
print("*" * 100)
print(t.loc[["a", "b"]])

5.6 t.loc[:,["X","Y"]]

t.loc[:,["X","Y"]] :取X,Y两列

t = pd.DataFrame(np.arange(24).reshape((8, 3)), index=list("abcdefgh"), columns=list("WXY"))
print(t)
print("*" * 100)
print(t.loc[:, ["X", "Y"]])

5.7 t.loc[["a","b"],["X","Y"]]

t.loc[["a","b"],["X","Y"]] :取a,b两行,X,Y两列

t = pd.DataFrame(np.arange(24).reshape((8, 3)), index=list("abcdefgh"), columns=list("WXY"))
print(t)
print("*" * 100)
print(t.loc[["a", "b"], ["X", "Y"]])

5.8 t.iloc[1,:]

t.iloc[1,:] :只取第1行,和所有列,默认下标为0开始

  • print(t1.iloc[2:, 1]) :从第3行开始获取,包含第三行;
  • print(t1.iloc[:2, 1]) :获取3行前面的行,不包括第3行;

5.9 t.iloc[:,2]

t.iloc[:,2] :取所有行,和第2列

5.10 t.iloc[:,[2,1]]

t.iloc[:,[2,1]] :取所有行,和第2、第1列

5.11 t.iloc[[0,2],[2,1]]

t.iloc[[0,2],[2,1]] :取0行和2行,取2列和1列

5.12 t.iloc[1:,:2]

t.iloc[1:,:2] :取1行后所有的行,2列前全部的列,不包含第2列

5.13 t.iloc[1:,:2] = np.nan

t.iloc[1:,:2] = np.nan :取1行后面的行,和2列前面的全部列将他们等于nan

6. bool索引和缺失数据的处理

6.1 t[(10 < t["W"]) & (t["W"] < 20)]

t[(10 < t["W"]) & (t["W"] < 20)] & 且:获取指定条件数据

t = pd.DataFrame(np.arange(24).reshape((8, 3)), index=list("abcdefgh"), columns=list("WXY"))
print(t)
print("*" * 100)
print(t[(10 < t["W"]) & (t["W"] < 20)])  # 获取指定条件数据

6.2 t[(6 == t["W"]) | (t["W"] == 9)]

t[(6 == t["W"]) | (t["W"] == 9)] | 或:获取指定行和列的数据

t = pd.DataFrame(np.arange(24).reshape((8, 3)), index=list("abcdefgh"), columns=list("WXY"))
print(t)
print("*" * 100)
print(t[(6 == t["W"]) | (t["W"] == 9)])  # 获取指定行和列的数据

6.3 t2["name"].str.split("/")

t2["name"].str.split("/") :切割数据

t1 = [{"name": "yiYi/170/90", "age": 24, "tel": 1186}, {"name": "zhangSan/175/120", "age": 28},
      {"name": "wangWu/180/130", "age": 30}]
t2 = pd.DataFrame(t1)
print(t2)
print("*" * 100)
print(t2["name"].str.split("/"))  # 获取指定列的数据

6.4 转换数据类型为list列表

t2["name"].str.split("/").tolist() :转换数据类型为list列表

t1 = [{"name": "yiYi/170/90", "age": 24, "tel": 1186}, {"name": "zhangSan/175/120", "age": 28},
      {"name": "wangWu/180/130", "age": 30}]
t2 = pd.DataFrame(t1)
print(t2)
print("*" * 100)
print(t2["name"].str.split("/").tolist())  # 转换数据类型为list

6.5 缺失数据的处理

处理NaN的数据;

注意:在计算平均值情况下,nan是不参与计算的,但是0会参与运算;

处理0的数据:t[t==0]=np.nan

6.6 pd.isnull(t1) & pd.notnull(t1)

pd.isnull(t1) & pd.notnull(t1) :判断是否为空和不为空,返回bool类型

t1 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("abc"), columns=list("WXYZ"))
t1[2:] = np.nan
print(t1)
print("*" * 100)
print(pd.isnull(t1))  # 判断是否为空
print("*" * 100)
print(pd.notnull(t1))  # 判断是否不为空

6.7 t1[pd.notnull(t1["W"])]

t1[pd.notnull(t1["W"])] :找到t1数组中W这一列不为null的值,并返回行

6.8 dropna 删除NaN的行

t1.dropna(axis=0, how="any") & t1.dropna(axis=0, how="all") :删除全部有nan的行、删除全部为nan的行

t1 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("abc"), columns=list("WXYZ"))
t1["W"] = np.nan
t1[2:] = np.nan
print(t1)
print("*" * 100)
print(t1.dropna(axis=0, how="any"))  # 删除NaN的行,默认
print("*" * 100)
print(t1.dropna(axis=0, how="all"))  # 当前行全部为NaN时,删除该行

6.9 t1.fillna(0)

t1.fillna(0) :填充NaN数据为0

t1 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("abc"), columns=list("WXYZ"))
t1["W"] = np.nan
t1[2:] = np.nan
print(t1)
print("*" * 100)
print(t1.fillna(0))  # 填充NaN数据为0

6.10 t1.fillna(t1.mean())

t1.fillna(t1.mean()) :不过,一般都会将均值填入到nan进行计算,统计

t1 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("abc"), columns=list("WXYZ"))
t1["W"] = np.nan
t1[2:] = np.nan
print(t1)
print("*" * 100)
print(t1.fillna(t1.mean()))  # 填充NaN数据为平均值

6.11 t1["X"].fillna(t1["X"].mean())

t1["X"].fillna(t1["X"].mean()) :仅对t1的X进行均值统计

注:当X列进行统计均值时,并不会将nan的值统计进行;

t1 = pd.DataFrame(np.arange(12).reshape(3, 4), index=list("abc"), columns=list("WXYZ"))
t1["W"] = np.nan
t1[2:] = np.nan
print(t1)
print("*" * 100)
print(t1["X"].fillna(t1["X"].mean()))  # 仅填充X列的NaN数据
print("*" * 100)
print(t1["X"].mean())  # 获取X列的平均值

7. pandas中的常用统计方法

描述性统计:

7.1 df.describe()

  • 提供DataFrame的基本统计信息(计数、均值、标准差、最小值、四分位数和最大值)。
df.describe()

7.2 df.mean()

  • 计算每一列的均值。
df.mean()

7.3 df.median()

  • 计算每一列的中位数。
df.median()

7.4 df.std()

  • 计算每一列的标准差。
df.std()

7.5 df.var()

  • 计算每一列的方差。
df.var()

7.6 df.min() 和 df.max()

  • 计算每一列的最小值和最大值。
df.min()
df.max()

7.7 df.sum()

  • 计算每一列的总和。
df.sum()

7.8 df.count()

  • 计算每一列的数量。
df.count()

7.9 df.quantile(q)

  • 计算每一列的分位数。q 是分位数的值,可以是 0 到 1 之间的浮点数。
df.quantile(0.25)  # 计算第一四分位数

聚合和分组统计:

7.10 df.groupby('column').mean()

  • 按某一列进行分组,并计算每组的均值。
  • 也可以使用count() 来统计分组后的结果;
df.groupby('column').mean()
7.10.1 分组统计案例
t2 = pd.DataFrame({
    "W": [0, 0, 1, 1],
    "X": [1, 5, 9, 13],
    "Y": [2, 6, 10, 14],
    "Z": [3, 7, 11, 15]
})
print(t2)
print("*" * 100)
print(t2.groupby("W").mean())

结果:

   W   X   Y   Z
0  0   1   2   3
1  0   5   6   7
2  1   9  10  11
3  1  13  14  15
****************************************************************************************************
     X     Y     Z
W                  
0   3.0   4.0   5.0
1  11.0  12.0  13.0

        这里,W=0 的组有两行,所以 X, Y, Z 列的均值分别是 (1+5)/2 = 3.0, (2+6)/2 = 4.0, (3+7)/2 = 5.0W=1 的组有两行,所以 X, Y, Z 列的均值分别是 (9+13)/2 = 11.0, (10+14)/2 = 12.0, (11+15)/2 = 13.0

7.11 df.groupby('column').agg({'col1': 'mean', 'col2': 'sum'})

  • 按某一列进行分组,并对指定列应用多个聚合函数。
df.groupby('column').agg({'col1': 'mean', 'col2': 'sum'})

7.12 df.pivot_table(values='col1', index='col2', columns='col3', aggfunc='mean')

  • 创建数据透视表。
df.pivot_table(values='col1', index='col2', columns='col3', aggfunc='mean')

其他常用统计方法:

7.13 df.corr()

  • 计算列之间的相关系数。
df.corr()

7.14 df.cov()

  • 计算列之间的协方差。
df.cov()

7.15 df.value_counts()

  • 计算某一列中每个值的出现次数。
df['column'].value_counts()

7.16 df.unique()

  • 获取某一列中的唯一值。
df['column'].unique()

7.17 df.nunique()

  • 计算每一列中的唯一值数量。
df.nunique()

7.18 df.mode()

  • 计算每一列的众数。
df.mode()

# 数据的合并和分组聚合

  • 字符串离散化的案例:
    • 大纲将字符串转换成数字,再进行统计的思路;
    • 主要是思路,将字符串离散化后统计;
    • 先把所有的字符串都置为零,然后把重复的值变成1或2或3或4这种数据,或出现过的为1,没出现过的为0,然后统计;
    • 代码思路:
      • 首先找到大列表,就是df中 的每个分裂的列表,把列表展开,进行list操作,然后去重,
      • 再把这个df做成一个数组的形状,有着行列索引,这个行列与电影的行列,分类是一样的,
      • 再对行数进行循环,当前出现过数据的地方都是1了,没有出现张的地方都是0,
      • 再zeros统计每个列中为0的结果,进行求和;最终得出结果;

8. 离散化及其在 Pandas 中的实现方法

参考:离散化及其在 Pandas 中的实现方法-CSDN博客

9. 数据合并

9.1 t1.join(t2)

t1.join(t2) :横向合并

  • 这时候会存在t1的所有行,但是t2没有的行全为NaN;
t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
t2 = pd.DataFrame(np.arange(4).reshape(2, 2), columns=list("CD"))
print(t1)
print("*" * 100)
print(t2)
print(t1.join(t2))  # 横向合并

9.2 merge方法

merge方法:按照指定的列把数据按照一定的方式合并到一起。

  • 合并方式:
    • 默认的合并方式是inner,即交集。
    • merge outer,并集,用NaN补全。
    • merge left,左边为准,用NaN补全。
    • merge right,右边为准,用NaN补全。

9.3 t1.merge(t2, on="B")

t1.merge(t2, on="B") : 合并相同的列,并删除重复列

t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
t2 = pd.DataFrame(np.arange(4).reshape(2, 2), columns=list("CB"))
print(t1)
print("*" * 100)
print(t2)
print("*" * 100)
print(t1.merge(t2, on="B"))  # 合并相同的列,并删除重复列

9.4 t1.merge(t2, how="outer", on="B")

t1.merge(t2, how="outer", on="B") :取出并合

t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
t2 = pd.DataFrame(np.arange(4).reshape(2, 2), columns=list("CB"))
print(t1)
print("*" * 100)
print(t2)
print("*" * 100)
print(t1.merge(t2, how="outer", on="B"))  # 取出并合

9.5 how="left" & how="right"

how="left" & how="right" :左连接以t1为准,右连接以t2为准

t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
t2 = pd.DataFrame(np.arange(4).reshape(2, 2), columns=list("CB"))
print(t1)
print("*" * 100)
print(t2)
print("*" * 100)
print(t1.merge(t2, on="B", how="left"))
print("*" * 100)
print(t1.merge(t2, on="B", how="right"))

10. 数据分组聚合

参考目录7.10;

11. 数据的索引学习

11.1 index & reindex

t1.index.values & t1.index = ["a", "b", "c"] & t1.reindex(["c", "a", "d"])

t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
print(t1)
print("*" * 100)
print(t1.index.values)  # 获取索引
print("*" * 100)
t1.index = ["a", "b", "c"]  # 修改索引
print(t1)
print("*" * 100)
print(t1.reindex(["c", "a", "d"]))  # 索引重排, 没有的索引会自动补NaN

11.2 t1.set_index("A")

t1.set_index("A") :将某一列作为索引

注:设置的索引值是可以重复的;

t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
print(t1)
print("*" * 100)
print(t1.set_index("A"))  # 将A列设置为索引

11.3 t1.set_index("A").index

t1.set_index("A").index :返回索引

将A列设置为索引后,并返回索引值;

t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
print(t1)
print("*" * 100)
print(t1.set_index("A"))  # 设置索引
print(t1.set_index("A").index)  # 索引返回

11.4 t1.set_index("A", drop=False)

t1.set_index("A", drop=False) :将A列设置为索引, drop=False 表示不删除A列

t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
print(t1)
print("*" * 100)
print(t1.set_index("A", drop=False))  # 将A列设置为索引, drop=False表示不删除A列

11.5 t1["A"].unique()

t1["A"].unique() :获取A列的唯一值

t1 = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list("AB"))
print(t1)
print("*" * 100)
print(t1.set_index("A", drop=False))  # 将A列设置为索引, drop=False表示不删除A列
print("*" * 100)
t1[1:] = 1
print(t1)
print("*" * 100)
print(t1["A"].unique())  # 获取A列的唯一值

  • len(t1.set_index("A").index) :获取索引长度
  • list(t1.set_index("A").index) :转换索引为list

11.6 a.set_index(["c", "d"]

a.set_index(["c", "d"] :设置两个索引

a = pd.DataFrame({
    'a': range(7),
    'b': range(7, 0, - 1),
    'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
    'd': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo']
})
print(a)
print("*" * 100)
b = a.set_index(["c", "d"])  # 设置两个索引
print(b)

索引练习:

11.7 b.swaplevel()

b.swaplevel() :c 和 d 交换索引位置

a = pd.DataFrame({
    'a': range(7),
    'b': range(7, 0, - 1),
    'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
    'd': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo']
})
print(a)
print("*" * 100)
b = a.set_index(["c", "d"])  # 设置两个索引
print(b)
print("*" * 100)
print(b.swaplevel())  # c 和 d 交换索引位置
   a  b    c    d
0  0  7  one  foo
1  1  6  one  bar
2  2  5  one  foo
3  3  4  two  bar
4  4  3  two  foo
5  5  2  two  bar
6  6  1  two  foo
****************************************************************************************************
         a  b
c   d        
one foo  0  7
    bar  1  6
    foo  2  5
two bar  3  4
    foo  4  3
    bar  5  2
    foo  6  1
****************************************************************************************************
         a  b
d   c        
foo one  0  7
bar one  1  6
foo one  2  5
bar two  3  4
foo two  4  3
bar two  5  2
foo two  6  1

type(b)

11.8 series.Series :索引类型

series.Series :索引类型

a = pd.DataFrame({
    'a': range(7),
    'b': range(7, 0, - 1),
    'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
    'd': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo']
})
b = a.set_index(["c", "d"])
c = b["a"]
print(c)
print("*" * 100)
print(type(c))

11.9 frame.DataFrame

frame.DataFrame :索引类型

a = pd.DataFrame({
    'a': range(7),
    'b': range(7, 0, - 1),
    'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
    'd': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo']
})
b = a.set_index(["c", "d"])
c = b[["a", "b"]]
print(c)
print("*" * 100)
print(type(c))

11.10 c["one"] & c["one"]["bar"]

c["one"] & c["one"]["bar"] 根据复合索引取值

a = pd.DataFrame({
    'a': range(7),
    'b': range(7, 0, - 1),
    'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
    'd': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo']
})
b = a.set_index(["c", "d"])
c = b["a"]
print(c)
print("*" * 100)
print(c["one"])
print("*" * 100)
print(c["one"]["bar"])
c    d  
one  foo    0
     bar    1
     foo    2
two  bar    3
     foo    4
     bar    5
     foo    6
Name: a, dtype: int64
****************************************************************************************************
d
foo    0
bar    1
foo    2
Name: a, dtype: int64
****************************************************************************************************
1

11.11 b.loc["one"].loc["bar"]

b.loc["one"].loc["bar"] :获取索引为one和bar的数据

a = pd.DataFrame({
    'a': range(7),
    'b': range(7, 0, - 1),
    'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
    'd': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo']
})
print(a)
print("*" * 100)
b = a.set_index(["c", "d"])
print(b)
print("*" * 100)
print(b.loc["one"].loc["bar"])  # 获取索引为one和bar的数据
   a  b    c    d
0  0  7  one  foo
1  1  6  one  bar
2  2  5  one  foo
3  3  4  two  bar
4  4  3  two  foo
5  5  2  two  bar
6  6  1  two  foo
****************************************************************************************************
         a  b
c   d        
one foo  0  7
    bar  1  6
    foo  2  5
two bar  3  4
    foo  4  3
    bar  5  2
    foo  6  1
****************************************************************************************************
a    1
b    6
Name: bar, dtype: int64

Process finished with exit code 0

11.12 b.swaplevel().loc["bar"]

b.swaplevel().loc["bar"] :获取索引为bar的数据

a = pd.DataFrame({
    'a': range(7),
    'b': range(7, 0, - 1),
    'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
    'd': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo']
})
print(a)
print("*" * 100)
b = a.set_index(["c", "d"])
print(b)
print("*" * 100)
print(b.loc["one"].loc["bar"])  # 获取索引为one和bar的数据
print("*" * 100)
print(b.swaplevel().loc["bar"])  # 获取索引为bar的数据
   a  b    c    d
0  0  7  one  foo
1  1  6  one  bar
2  2  5  one  foo
3  3  4  two  bar
4  4  3  two  foo
5  5  2  two  bar
6  6  1  two  foo
****************************************************************************************************
         a  b
c   d        
one foo  0  7
    bar  1  6
    foo  2  5
two bar  3  4
    foo  4  3
    bar  5  2
    foo  6  1
****************************************************************************************************
a    1
b    6
Name: bar, dtype: int64
****************************************************************************************************
     a  b
c        
one  1  6
two  3  4
two  5  2

Process finished with exit code 0

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

火热夏季:浦语*书生InternLM大模型实战闯关-入门岛之Linux基础知识

一、ssh链接与端口映射并运行hello_wold.py 1.创建开发机 InternStudio创建开发机 2.进入开发机 3.Ssh链接开发机 powerShell终端ssh链接开发机。 4.创建一个hello_world.py文件web demo 5.运行web demo 6.端口映射 7.本地浏览器打开web 二、 VSCODE 远程连接开发机并创建一个…

Mac 上安转文字转 SQL 利器 WrenAI

WrenAI 是一个开源的 Text-SQL 的工具&#xff0c;通过导入数据库结构&#xff0c;通过提问的方式生成 SQL。本文将讲述如何在 MacOS 上安装 WrenAI。要运行WrenAI&#xff0c;首先需要安装 Docker 桌面版。 下载 WrenAI https://github.com/Canner/WrenAI/releases/tag/0.7.…

Spring Boot 高级配置:如何轻松定义和读取自定义配置

目录 1. 环境准备 2. 读取配置数据 2.1 使用 Value注解 2.2 Environment对象 2.3.2.3 自定义对象 这篇博客我们将深入探讨如何在Spring Boot应用中有效地定义和读取自定义配置。掌握这一技巧对于任何希望优化和维护其应用配置的开发者来说都是至关重要的。我们将从基础开始…

HTTPS理解

一个完整的HTTP连接 TCP三次握手接受窗口发送数据关闭连接 接受窗口是用来做什么呢&#xff1f; 它根据自身网络情况设置不同大小的值用来控制对方发送速度&#xff0c;避免对方发送太快&#xff0c;导致网络拥塞。 为什么TCP握手要三次&#xff1f; 1&#xff09;确认双方的…

镭速Raysync vs MASV:哪个才最合适企业大文件传输

在当前信息爆炸的时代&#xff0c;企业面临的一个关键挑战是如何高效、安全地传输日益增长的大量文件。选择正确的文件传输工具对于企业的日常运作至关重要。本文旨在对比分析两款备受瞩目的企业级大文件传输解决方案——镭速Raysync和MASV&#xff0c;以助企业决策者挑选出最适…

图像中高频信息、低频信息与ComfyUI中图像细节保留的简单研究

&#x1f9f5;背景 在做AI绘图的时候&#xff0c;经常有一些图像的细节需要保留原始图像内容&#xff0c;比如说衣服的细节&#xff0c;商品的文字标签等等&#xff0c;如果这些地方发生了变化&#xff0c;就会导致生成的结果无法直接商用&#xff0c;而让生成的图像完全保留原…

加速你的下载,IDM神器不可错过!快如闪电,稳如老狗

嗨&#xff0c;各位小伙伴&#xff01;&#x1f44b;&#x1f44b;&#x1f44b; 今天我要安利一个让你的下载体验起飞的神奇工具——Internet Download Manager&#xff08;简称IDM&#xff09;&#x1f6eb;。想象一下网速慢得像蜗牛爬的场景&#xff0c;是不是让人抓狂&…

3个方法教你如果快速绕过Excel工作表保护密码

在日常生活中&#xff0c;我们可能会遇到一些特殊情况&#xff0c;比如不小心忘记了Excel文件中设置的打开密码。别担心&#xff01;这里为您带来一份详细的Excel文件密码移除教程&#xff0c;助您轻松绕过Excel工作表保护。 方法一&#xff1a;使用备份文件 如果您有文件的备…

24暑假计划

暑假计划&#xff1a; 1.从明天起开始将C语言的部分补充完整&#xff0c;这部分的预计在7月24日前完成 2.由于之前的文章内容冗余&#xff0c;接下来进行C语言数据结构的重新编写和后面内容的补充预计8月10号前完成 3.后续开始C的初级学习

【热梗案例】知识点阶段性综合汇总

文章目录 渲染对象、实现统计功能实现删除功能设置发布按钮实现发布按钮的提交功能 直接用CSS的模板&#xff0c;模板代码如下&#xff1a; <template><view class"title">近期热梗</view><view class"out"> <view class&qu…

SuperCLUE最新测评发布,360智脑大模型稳居大模型第一梯队

7月9日&#xff0c;国内权威大模型评测机构SuperCLUE发布《中文大模型基准测评2024上半年报告》&#xff0c;360智脑大模型&#xff08;360gpt2-pro&#xff09;在SuperCLUE基准6月测评中&#xff0c;取得总分72分&#xff0c;超过GPT-3.5-Turbo-0125&#xff0c;位列国内大模型…

马蹄集 oj赛(双周赛7.3-7.14)

目录 围栏木桩 大厨小码哥 最长子段和 旅费 散步 抽奖 海龟 线段树 纸带 异或和 上楼梯 上楼梯2 围栏木桩 难度:黄金时间限制:1秒四占用内存:128 M 某农场有一个由按编号排列的 ,,根木桩构成的首尾不相连的围栏。现要在这个围栏中选取一些太桩&#xff0c;按照原有…

PHP 安装Memcached 扩展 PHP使用Memcache

memcache扩展下载 访问官网&#xff1a;https://pecl.php.net/package/memcache&#xff0c;下载合适的memcache版本的安装包&#xff0c;注意要与php版本相匹配。 1、查看运行环境php版本,可以运行以下代码 <?php phpinfo(); ?>2、查看版本信息以及是否支持多线程…

YOLOv5改进 | 注意力机制| 对密集和小目标友好的EVAblock【完整代码 + 小白轻松上手】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a; 《YOLOv5入门 改…

redis批量删除keys,用lua脚本。

文章目录 现象解决方法 现象 系统报错&#xff1a; misconf redis is configured to save ....后查看机器内存。 是内存满了&#xff0c;需要删除其中的key 解决方法 (1) 编写一个脚本&#xff0c;放在redis-cli.exe同一个目录 (2) 脚本内容如下&#xff1a; -- 使用Lua脚…

0MFC基于对话框模式——前置基础

文章目录 系统记得调成窗口![请添加图片描述](https://i-blog.csdnimg.cn/direct/e77eba56b14b42c8b86f210c72351684.png)基于对话框各部分代表![请添加图片描述](https://i-blog.csdnimg.cn/direct/673d07e6d17f4e528dd01ae8ebfa5b64.png)按钮实现函数方式![请添加图片描述](h…

【背就有效】软考中级信息系统监理师核心知识点汇总!

宝子们&#xff01;上半年软考已经告一段落了&#xff0c;准备下半年考信息系统监理师的小伙伴可以开始准备了。这里给大家整理了信息系统监理师核心知识点汇总&#xff0c;涵盖全书90%的重点&#xff0c;先把这个存下&#xff01;再慢慢看书&#xff0c;边看书边背这个&#x…

【利用GroundingDINO裁剪分类任务的数据集】及文本提示检测图像任意目标(Grounding DINO) 的使用

文章目录 背景1.Grounding DINO安装2.裁剪指定目标的脚本 背景 在处理公开数据集ImageNet-21k的时候发现里面有很多的数据有问题&#xff0c;比如&#xff0c;数据目标有很多背景&#xff0c;且部分类别有其他种类的图片。针对数据目标有很多背景&#xff0c;公开数据集ImageNe…

TongRDS 2214 docker版指引(by lqw )

文章目录 前言准备工作中心节点服务节点哨兵节点 前言 部署docker版本&#xff0c;建议先参考TongRDS2214手动部署版指引&#xff08;by lqwsy&#xff09; 在本地手动部署了一套适合业务场景的rds 服务后&#xff0c;再通过dockerfile 打镜像。 准备工作 1.准备对应的安装包…

新书速览|HTML5+CSS3 Web前端开发与实例教程:微课视频版

《HTML5CSS3 Web前端开发与实例教程&#xff1a;微课视频版》 本书内容 《HTML5CSS3 Web前端开发与实例教程&#xff1a;微课视频版》秉承“思政引领&#xff0c;立德树人”的教育理念&#xff0c;自然融入多维度、深层次的思政元素&#xff0c;全面对标企业和行业需求&#x…