看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas.combine()
方法用于将两个数据对象(如 DataFrame 或 Series)根据自定义的函数规则进行逐元素合并。它可以处理复杂的合并逻辑,比如在每个元素的层面上选择非空值或计算某种操作的结果。
与另一个DataFrame按列组合。使用func按元素组合列,将DataFrame与其他DataFrame组合在一起。生成的DataFrame的行索引和列索引将是两者的并集。
DataFrame.combine(
other,
func,
fill_value=None,
overwrite=True
)
Series.combine(other, func, fill_value=None)
classmethod Timestamp.combine(date, time)
other:
DataFrame
或 Series
func:
function
other
对象的每个元素,决定合并后的值。fill_value:
scalar
overwrite:
bool
True
,则 other
对象中的值会覆盖当前对象中的值;如果为 False
,则当前对象中的非空值会保留。DataFrame
或 Series
),其中包含根据提供的合并函数处理后的数据。combine()
方法。combine()
是一个非常灵活的工具。使用一个选择较小列的简单函数进行组合。
df1 = pd.DataFrame({'A': [0, 0], 'B': [4, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
take_smaller = lambda s1, s2: s1 if s1.sum() < s2.sum() else s2
df1.combine(df2, take_smaller)
'''
A B
0 0 3
1 0 3
'''
使用真正的元素组合函数的示例。
df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
df1.combine(df2, np.minimum)
'''
A B
0 1 2
1 0 3
'''
在将列传递给合并函数之前,使用fill_value填充Nones。
df1 = pd.DataFrame({'A': [0, 0], 'B': [None, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
df1.combine(df2, take_smaller, fill_value=-5)
'''
A B
0 0 -5.0
1 0 4.0
'''
但是,如果两个数据帧中的同一元素都是None,则保留None
df1 = pd.DataFrame({'A': [0, 0], 'B': [None, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [None, 3]})
df1.combine(df2, take_smaller, fill_value=-5)
'''
A B
0 0 -5.0
1 0 3.0
'''
示例,演示了当数据帧之间的轴不同时使用覆盖和行为。
df1 = pd.DataFrame({'A': [0, 0], 'B': [4, 4]})
df2 = pd.DataFrame({'B': [3, 3], 'C': [-10, 1], }, index=[1, 2])
df1.combine(df2, take_smaller)
'''
A B C
0 NaN NaN NaN
1 NaN 3.0 -10.0
2 NaN 3.0 1.0
'''
df1.combine(df2, take_smaller, overwrite=False)
'''
A B C
0 0.0 NaN NaN
1 0.0 3.0 -10.0
2 NaN 3.0 1.0
'''
演示传入数据帧的偏好。
df2 = pd.DataFrame({'B': [3, 3], 'C': [1, 1], }, index=[1, 2])
df2.combine(df1, take_smaller)
'''
A B C
0 0.0 NaN NaN
1 0.0 3.0 NaN
2 NaN 3.0 NaN
'''
df2.combine(df1, take_smaller, overwrite=False)
'''
A B C
0 0.0 NaN NaN
1 0.0 3.0 1.0
2 NaN 3.0 1.0
'''
考虑2个数据集s1和s2,其中包含不同鸟类的最高时钟速度。
s1 = pd.Series({'falcon': 330.0, 'eagle': 160.0})
s1
'''
falcon 330.0
eagle 160.0
dtype: float64
'''
s2 = pd.Series({'falcon': 345.0, 'eagle': 200.0, 'duck': 30.0})
s2
'''
falcon 345.0
eagle 200.0
duck 30.0
dtype: float64
'''
现在,将这两个数据集结合起来,查看两个数据集中鸟类的最高速度
s1.combine(s2, max)
'''
duck NaN
eagle 200.0
falcon 345.0
dtype: float64
'''
在前面的示例中,duck的结果值缺失,因为NaN和浮点数的最大值是NaN。因此,在这个例子中,我们设置fill_value=0,因此返回的最大值将是某个数据集中的值。
s1.combine(s2, max, fill_value=0)
'''
duck 30.0
eagle 200.0
falcon 345.0
dtype: float64
'''
from datetime import date, time
pd.Timestamp.combine(date(2020, 3, 14), time(15, 30, 15))
# Timestamp('2020-03-14 15:30:15')
以下是如何使用 pandas.DataFrame.combine
方法进行元素级别的合并。
import pandas as pd
import numpy as np
# 构造示例数据
data1 = pd.DataFrame({
'A': [1, np.nan, 3, np.nan],
'B': [4, 5, np.nan, 7]
})
data2 = pd.DataFrame({
'A': [np.nan, 2, 3, 4],
'B': [np.nan, np.nan, 6, 8]
})
print("data1:")
print(data1)
print("\ndata2:")
print(data2)
# 使用 combine 进行合并,选择较大值
merged_data = data1.combine(data2, func=lambda s1, s2: np.where(pd.isna(s1), s2, np.where(pd.isna(s2), s1, np.maximum(s1, s2))))
print("\n合并后的数据:")
print(merged_data)
输出结果:
data1:
A B
0 1.0 4.0
1 NaN 5.0
2 3.0 NaN
3 NaN 7.0
data2:
A B
0 NaN NaN
1 2.0 NaN
2 3.0 6.0
3 4.0 8.0
合并后的数据:
A B
0 1.0 4.0
1 2.0 5.0
2 3.0 6.0
3 4.0 8.0
在这个例子中,我们使用 combine()
方法按元素比较 data1
和 data2
中的值,并选择较大的值作为合并结果。我们自定义了一个函数 lambda s1, s2: np.where(pd.isna(s1), s2, np.where(pd.isna(s2), s1, np.maximum(s1, s2)))
,用于处理每个元素对,选择非空值并比较大小。
更新时间:2024-08-14 16:37:28 标签:pandas python 合并 函数