目录
拼接
1.1 append
1.2 concat关联
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
共同學習,寫下你的評論
評論加載中...
作者其他優質文章