ITPub博客

首页 > IT职业 > IT生活 > 11 Pandas转换连接详解

11 Pandas转换连接详解

IT生活 作者:drinkant 时间:2021-09-09 10:06:41 0 删除 编辑

目录

  1. 拼接
    1.1 append
    1.2 concat

  2. 关联
    2.1 merge
    2.2 join

# 导入相关库import numpy as npimport pandas as pd

1 拼接

有两个DataFrame,都存储了用户的一些信息,现在要拼接起来,组成一个DataFrame,如何实现呢?

data1 = {    "name": ["Tom", "Bob"],    "age": [18, 30],    "city": ["Bei Jing ", "Shang Hai "]
}

df1 = pd.DataFrame(data=data1)
df1

    name    age city
0   Tom 18  Bei Jing
1   Bob 30  Shang Hai


data2 = {    "name": ["Mary", "James"],    "age": [35, 18],    "city": ["Guang Zhou", "Shen Zhen"]
}

df2 = pd.DataFrame(data=data2)
df2

    name    age city
0   Mary    35  Guang Zhou
1   James   18  Shen Zhen

1.1 append

append 是最简单的拼接两个DataFrame的方法。

df1.append(df2)    name    age city0   Tom     18  Bei Jing1   Bob     30  Shang Hai0   Mary    35  Guang Zhou1   James   18  Shen Zhen

可以看到,拼接后的索引默认还是原有的索引,如果想要重新生成索引的话,设置参数 ignore_index=True 即可。

df1.append(df2, ignore_index=True)

    name    age city0   Tom     18  Bei Jing1   Bob     30  Shang Hai2   Mary    35  Guang Zhou3   James   18  Shen Zhen

1.2 concat

除了 append 这种方式之外,还有 concat 这种方式可以实现相同的功能。

objs=[df1, df2]
pd.concat(objs, ignore_index=True)

    name    age city0   Tom     18  Bei Jing1   Bob     30  Shang Hai2   Mary    35  Guang Zhou3   James   18  Shen Zhen

如果想要区分出不同的DataFrame的数据,可以通过设置参数 keys,当然得设置参数ignore_index=False。

pd.concat(objs, ignore_index=False, keys=["df1", "df2"])

       name    age  city
df1 0   Tom     18  Bei Jing    1   Bob     30  Shang Hai
df2 0   Mary    35  Guang Zhou    1   James   18  Shen Zhen

2 关联

有两个DataFrame,分别存储了用户的部分信息,现在需要将用户的这些信息关联起来,如何实现呢?

data1 = {    "name": ["Tom", "Bob", "Mary", "James"],    "age": [18, 30, 35, 18],    "city": ["Bei Jing ", "Shang Hai ", "Guang Zhou", "Shen Zhen"]
}

df1 = pd.DataFrame(data=data1)
df1

    name    age city0   Tom     18  Bei Jing1   Bob     30  Shang Hai2   Mary    35  Guang Zhou3   James   18  Shen Zhen


data2 = {"name": ["Bob", "Mary", "James", "Andy"],        "sex": ["male", "female", "male", np.nan],         "income": [8000, 8000, 4000, 6000]
}

df2 = pd.DataFrame(data=data2)
df2


   name sex income0   Bob     male    80001   Mary    female  80002   James   male    40003   Andy    NaN     6000

2.1 merge

通过 pd.merge 可以关联两个DataFrame,这里我们设置参数 on="name",表示依据 name 来作为关联键。

pd.merge(df1, df2, on="name")

    name    age city        sex    income
0   Bob     30  Shang Hai   male    8000
1   Mary    35  Guang Zhou  female  8000
2   James   18  Shen Zhen   male    4000

关联后发现数据变少了,只有 3 行数据,这是因为默认关联的方式是 inner,如果不想丢失任何数据,可以设置参数 how="outer"。

pd.merge(df1, df2, on="name", how="outer")

    name    age     city        sex     income0   Tom     18.0    Bei Jing    NaN        NaN1   Bob     30.0    Shang Hai   male    8000.02   Mary    35.0    Guang Zhou  female  8000.03   James   18.0    Shen Zhen   male    4000.04   Andy    NaN     NaN         NaN     6000.0

可以看到,设置参数 how="outer" 后,确实不会丢失任何数据,他会在不存在的地方填为缺失值。

如果我们想保留左边所有的数据,可以设置参数 how="left";反之,如果想保留右边的所有数据,可以设置参数 how="right"

pd.merge(df1, df2, on="name", how="left")

name    age     city        sex     income0   Tom     18  Bei Jing    NaN     NaN1   Bob     30  Shang Hai   male    8000.02   Mary    35  Guang Zhou  female  8000.03   James   18  Shen Zhen   male    4000.0

有时候,两个 DataFrame 中需要关联的键的名称不一样,可以通过 left_on和 right_on 来分别设置。

df1.rename(columns={"name": "name1"}, inplace=True)
df1

    name1   age city0   Tom     18  Bei Jing1   Bob     30  Shang Hai2   Mary    35  Guang Zhou3   James   18  Shen Zhen


df2.rename(columns={"name": "name2"}, inplace=True)
df2

    name2   sex   income0   Bob     male    80001   Mary    female  80002   James   male    40003   Andy    NaN     6000pd.merge(df1, df2, left_on="name1", right_on="name2")

    name1   age city        name2   sex   income0   Bob     30  Shang Hai   Bob     male    80001   Mary    35  Guang Zhou  Mary    female  80002   James   18  Shen Zhen   James   male    4000

有时候,两个DataFrame中都包含相同名称的字段,如何处理呢?
我们可以设置参数 suffixes,默认 suffixes=('_x', '_y') 表示将相同名称的左边的DataFrame的字段名加上后缀_x,右边加上后缀_y。

df1["sex"] = "male"df1

    name1   age city        sex
0   Tom     18  Bei Jing    male
1   Bob     30  Shang Hai   male
2   Mary    35  Guang Zhou  male
3   James   18  Shen Zhen   male


pd.merge(df1, df2, left_on="name1", right_on="name2")

    name1   age city       sex_x    name2   sex_y   income
0   Bob     30  Shang Hai   male    Bob     male    8000
1   Mary    35  Guang Zhou  male    Mary    female  8000
2   James   18  Shen Zhen   male    James   male    4000


pd.merge(df1, df2, left_on="name1", right_on="name2", suffixes=("_left", "_right"))

    name1   age city    sex_left    name2   sex_right   income
0   Bob     30  Shang Hai   male    Bob     male    8000
1   Mary    35  Guang Zhou  male    Mary    female  8000
2   James   18  Shen Zhen   male    James   male    4000

2.2 join

除了 merge 这种方式外,还可以通过 join 这种方式实现关联。相比 merge,join 这种方式有以下几个不同:

默认参数on=None,表示关联时使用左边和右边的索引作为键,设置参数on可以指定的是关联时左边的所用到的键名
左边和右边字段名称重复时,通过设置参数 lsuffix 和 rsuffix 来解决。

df1.join(df2.set_index("name2"), on="name1", lsuffix="_left")

name1   age city        sex_left        sex     income0   Tom     18  Bei Jing    male    NaN     NaN1   Bob     30  Shang Hai   male    male    8000.02   Mary    35  Guang Zhou  male    female  8000.03   James   18  Shen Zhen   male    male    4000.0



作者:7125messi
链接:https://www.jianshu.com/p/cc53df7a2257


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1297/viewspace-2816574/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-15

  • 博文量
    114
  • 访问量
    1257