首页 > IT职业 > IT生活 > 11 Pandas转换连接详解
拼接
1.1 append
1.2 concat
关联
2.1 merge
2.2 join
# 导入相关库import numpy as npimport pandas as pd
有两个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
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
除了 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
有两个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
通过 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
除了 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/ ,如需转载,请注明出处,否则将追究法律责任。