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

目录

# 开篇

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2/3代码格式化问题,看着太难受了

1.原本的代码&#xff1a; 格式化后的代码&#xff1a; 太难受了&#xff01; 2.原本的代码 格式化后的代码 格式化跟有病似的&#xff0c;看着非常难受&#xff01; 有没有什么插件解决&#xff01;&#xff1f;

C++ //练习 14.44 编写一个简单的桌面计算器使其能处理二元运算。

C Primer&#xff08;第5版&#xff09; 练习 14.44 练习 14.44 编写一个简单的桌面计算器使其能处理二元运算。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************************************************…

Cesium中实现全球体积云效果的一种方案

原生 Cesium 提供了一种积云的效果&#xff0c;云的物理特征和渲染性能都还不错&#xff0c;这种方案适合表达小范围相对离散的云朵&#xff0c;但是用来实现全球范围下相对连续、柔和渐变的云层比较困难。本文在体渲染的基础上&#xff0c;参考了开源社区中 shadertoy 和 thre…

java数组之线性查找、二分法查找

一、线性查找 思想&#xff1a;如果想在一个数组中查找是否有某个元素&#xff0c;最容易想到的办法就是遍历数组&#xff0c;将数组中元素与想要查找的元素逐个对比&#xff0c;如果相等表示找到了&#xff0c;如果不等&#xff0c;则表示没找到。这就是线性查找的思想。 案例…

如何在微信小程序中对接微信支付

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

流模型flow

流模型 Flow 超详解&#xff0c;基于 Flow 的生成式模型&#xff0c;从思路到基础到公式推导到模型理解与应用&#xff08;Flow-based Generative Model&#xff09;_generative flows-CSDN博客

软考《信息系统运行管理员》-3.1信息系统设施运维的管理体系

3.1信息系统设施运维的管理体系 1 信息系统设施运维的对象 基础环境 主要包括信息系统运行环境(机房、设备间、配线室、基站、云计算中心 等)中的空调系统、供配电系统、通信应急设备系统、防护设备系统(如消防系统、安全系统) 等&#xff0c;能维持系统安全正常运转&#xf…

食物链之带权并查集解法

直接看题&#xff1a;https://www.acwing.com/problem/content/description/242/ 下面就是代码的实现了&#xff0c;因为自己与自己肯定是同类我们初始化为0. 下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,k; int fk,x,y; int fa[10001…

C++ STL IO流介绍

目录 一&#xff1a;IO流的继承关系&#xff1a; 二&#xff1a;输入输出功能 1. 基本用法 2. 格式化输入 3.非格式化输入 4. 格式化输出 三&#xff1a;流 1. 字符流 2. 向字符流中写入数据 3. 从字符流中读出数据 4. 清空字符流 5.完整的例子 四&#xff1a;文件…

RISC-V异常处理流程概述(2):异常处理机制

RISC-V异常处理流程概述(2):异常处理机制 一、异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册一、异常处理流程和异常委托 1.1 异常处理流程 发生异常时,首先需要执…

生物打印后的生物力学过程

生物打印后的生物力学过程 3D生物打印技术在组织工程领域展现出巨大的潜力&#xff0c;但打印后组织的生物力学特性对其最终成功至关重要。本文将详细介绍打印后组织的生物力学特性及其在组织工程中的应用。 1. 打印后水凝胶交联 原位交联可以在生物打印过程中提供足够的机械…

开发个人Go-ChatGPT--5 模型管理 (一)

开发个人Go-ChatGPT–5 模型管理 (一) 背景 开发一个chatGPT的网站&#xff0c;后端服务如何实现与大模型的对话&#xff1f;是整个项目中开发困难较大的点。 如何实现上图的聊天对话功能&#xff1f;在开发后端的时候&#xff0c;如何实现stream的响应呢&#xff1f;本文就…

SprintBoot创建遇到的问题

最近使用IDEA版本为2022.3.1&#xff0c;java版本为21.0.3&#xff0c;现在做一个创建SprintBoot3的一个大体流程 1.先下载Maven&#xff0c;解压到一个位置 maven下载 2.配置setting.xml文件 这路径自己配置&#xff0c;这里不多演示 代码如下&#xff1a; <mirror>&…

开源网页终端webssh容器镜像制作与使用

1.Dockerfile编写&#xff1a; # 指定镜像目标平台与镜像名 alpine表示基础镜像 第一层镜像 FROM --platform$TARGETPLATFORM alpine # 添加元数据到镜像 LABEL maintainer"Jrohy <euvkzxgmail.com>" # 编译时变量 ARG TARGETARCH # 执行编译命令&#xff0c;…

代码随想录算法训练营第四十九天| 647. 回文子串、 516.最长回文子序列

647. 回文子串 题目链接&#xff1a;647. 回文子串 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 思路&#xff1a; dp[i][j] 表示字符串 s 从索引 i 到索引 j 这一段子串是否为回文子串。 当s[i]与s[j]不相等&#xff0c;那没啥好说的了&#xff0c;dp[i][j]一定是fa…

柔性测斜仪:监测钻孔位移的核心利器

柔性测斜仪&#xff0c;作为一款创新的测量工具&#xff0c;凭借其卓越的设计与性能&#xff0c;在地下建筑、桥梁、隧道及水利水电工程等领域展现出非凡的应用价值。其安装便捷、操作简便、高精度及长寿命等特性&#xff0c;使之成为监测钻孔垂直与水平位移的理想选择。以下是…

打卡第8天-----字符串

进入字符串章节了,我真的特别希望把leetcode上的题快点全部都给刷完,我是社招准备跳槽才选择这个训练营的,面试总是挂算法题和编程题,希望通过这个训练营我的算法和编程的水平能有所提升,抓住机会,成功上岸。我现在的这份工作,真的是一天都不想干了,但是下家工作单位还…

VS Code 扩展如何发布到私有Nexus的正确姿势

VS Code扩展的发布 VS Code 扩展的发布需要使用到vsce&#xff0c;vsce是一个用于打包、发布和管理 VS Code 扩展的命令行工具。可以通过 npm 来全局安装它&#xff1a; npm install -g vsce发布扩展到微软的应用市场 VS Code 的应用市场基于微软自己的 Azure DevOps。要发布…

计算机网络--tcpdump和iptable设置、内核参数优化策略

tcpdump工具 tcpdump命令&#xff1a; 选项字段&#xff1a; 过滤表达式&#xff1a; 实用命令&#xff1a; TCP三次握手抓包命令&#xff1a; #客户端执行tcpdump 抓取数据包 tcpdump -i etho tcp and host 192.168.12.36 and port 80 -W timeout.pcapnetstat命令 netst…

element el-table实现表格动态增加/删除/编辑表格行,带校验规则

本篇文章记录el-table增加一行可编辑的数据列&#xff0c;进行增删改。 1.增加空白行 直接在页面mounted时对form里面的table列表增加一行数据&#xff0c;直接使用push() 方法增加一列数据这个时候也可以设置一些默认值。比如案例里面的 产品件数 。 mounted() {this.$nextTi…