详解PANDAS数据合并与重塑(join/merge篇)
在PANDAS中,数据合并和重塑是十分重要的基础操作。本文将详细讲解PANDAS中的数据合并和重塑。
合并数据
横向合并
横向合并意味着将两个数据集按照行合并,即增加新的列。
可以使用pandas
中的merge()
函数实现。例如:
import pandas as pd
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'],
'value': [5, 6, 7, 8]})
merged = pd.merge(df1, df2, on='key', how='inner')
这里df1
和df2
是两个数据集,它们之间有一个共同的列key
,我们使用merge()
函数将它们按照key
列进行合并。how
参数表示合并方式,可选值包括:
inner
: 只保留同时出现在两个数据集中的行outer
: 保留出现在任意一个数据集中的所有行left
: 保留出现在左边数据集(df1
)中的所有行right
: 保留出现在右边数据集(df2
)中的所有行
结果如下:
key value_x value_y
0 B 2 5
1 D 4 6
这里的value_x
和value_y
分别是df1
和df2
中的value
列,因为它们原来是不同的列名,所以被自动重命名了。
纵向合并
纵向合并意味着将两个数据集按照列合并,即增加新的行。
可以使用pandas
中的concat()
函数实现。例如:
import pandas as pd
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['E', 'F', 'G', 'H'],
'value': [5, 6, 7, 8]})
concatenated = pd.concat([df1, df2])
这里df1
和df2
是两个数据集,它们的列名和列数相同,我们使用concat()
函数将它们按照列进行合并。concat()
函数默认按照纵向进行合并,即增加新的行。
结果如下:
key value
0 A 1
1 B 2
2 C 3
3 D 4
4 E 5
5 F 6
6 G 7
7 H 8
重塑数据
在PANDAS中,重塑数据的操作包括“长表格”转换为“宽表格”和“宽表格”转换为“长表格”两种。下面分别介绍具体的操作。
长表格转换为宽表格
将长表格转换为宽表格是指将一张表格中的一列分割成多列,并将元素填充到这些列中去。
可以使用pandas
中的pivot_table()
函数实现。例如:
import pandas as pd
data = pd.DataFrame({'date': ['2020-01-01', '2020-01-02', '2020-01-03'],
'product': ['A', 'A', 'B'],
'sales': [100, 200, 300]})
pivoted = pd.pivot_table(data, values='sales', index='date', columns='product')
这里data
是一张长表格,我们使用pivot_table()
函数将data
中的product
列转换成了多个列。其中values
参数表示要填充到新列中的元素,index
参数表示新表格的行索引,columns
参数表示新表格的列索引。
结果如下:
product A B
date
2020-01-01 100 NaN
2020-01-02 200 NaN
2020-01-03 NaN 300
宽表格转换为长表格
将宽表格转换为长表格是指将一张表格中的多列合并成一列,并将元素填充到这一列中去。
可以使用pandas
中的melt()
函数实现。例如:
import pandas as pd
data = pd.DataFrame({'date': ['2020-01-01', '2020-01-02', '2020-01-03'],
'product_A_sales': [100, 200, 300],
'product_B_sales': [400, 500, 600]})
melted = pd.melt(data, id_vars='date', var_name='product', value_name='sales')
这里data
是一张宽表格,我们使用melt()
函数将data
中的product_A_sales
和product_B_sales
合并成了一列。其中id_vars
参数表示不需要合并的列,var_name
参数表示合并后的列名,value_name
参数表示填充到新列中的元素。
结果如下:
date product sales
2020-01-01 product_A 100
2020-01-02 product_A 200
2020-01-03 product_A 300
2020-01-01 product_B 400
2020-01-02 product_B 500
2020-01-03 product_B 600
示例说明
下面给出两个示例说明。
示例一:横向合并
假设我们有两张表格,一张包含考试成绩,另一张包含考试日期。我们要将这两张表格按照学生姓名合并起来,得到一张包含学生姓名、考试成绩和考试日期的表格。
import pandas as pd
scores = pd.DataFrame({'name': ['Alice', 'Bob', 'Charlie'],
'score': [80, 90, 85]})
dates = pd.DataFrame({'name': ['Alice', 'Charlie', 'David'],
'date': ['2020-01-01', '2020-01-02', '2020-01-01']})
merged = pd.merge(scores, dates, on='name', how='outer')
这里的merged
是按照name
列将scores
和dates
合并后的表格。
示例二:长表格转换为宽表格
假设我们得到了如下的一张表格,它记录了不同地区在某一年的GDP。
地区 一季度 二季度 三季度 四季度
北京 2000 2200 2400 2600
上海 2400 2600 2800 3000
广州 1800 1900 2000 2100
深圳 2000 2200 2400 2600
我们希望将他转换成宽表格的形式,即如下形式:
一季度 二季度 三季度 四季度
北京 2000 2200 2400 2600
上海 2400 2600 2800 3000
广州 1800 1900 2000 2100
深圳 2000 2200 2400 2600
可以使用如下的代码实现:
import pandas as pd
data = pd.DataFrame({'地区': ['北京', '上海', '广州', '深圳'],
'一季度': [2000, 2400, 1800, 2000],
'二季度': [2200, 2600, 1900, 2200],
'三季度': [2400, 2800, 2000, 2400],
'四季度': [2600, 3000, 2100, 2600]})
pivoted = pd.pivot_table(data, index='地区')
这里pivoted
是将data
表格按照地区
列进行重塑后的新表格,我们不需要指定columns
参数因为它只有一个值列GDP
。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解PANDAS 数据合并与重塑(join/merge篇) - Python技术站