
在数据处理中,我们经常需要将一个DataFrame中的新列添加到另一个DataFrame中。Pandas提供了多种方法来实现这一目标,但如果不理解其底层逻辑,尤其是在涉及重复索引时,可能会遇到意想不到的结果。
考虑以下场景:我们有一个初始DataFrame df,其索引(例如,BS列)包含重复值。我们希望从另一个DataFrame df1 中添加一列 M2,并将其与 df 的现有行对齐。
初始DataFrame df:
import pandas as pd
value = {'M1': [3.65, 3.58, 3.5], 'BS': [999, 999, 999], 'RAW':['A', 'B', 'C']}
df = pd.DataFrame(value).set_index('BS')
print("初始 DataFrame df:")
print(df)输出:
M1 RAW BS 999 3.65 A 999 3.58 B 999 3.50 C
待添加的DataFrame df1:
value = {'M2': [3.35, 3.38, 3.3], 'BS': [999, 999, 999]}
df1 = pd.DataFrame(value).set_index('BS')
print("\n待添加的 DataFrame df1:")
print(df1)输出:
M2 BS 999 3.35 999 3.38 999 3.30
当尝试使用 df.join(df1, on='BS', how='outer') 来合并这两个DataFrame时,预期是得到一个包含 M1, M2, RAW 列,且行数不变的DataFrame。然而,实际结果却出人意料:
df_joined = df.join(df1, on='BS', how='outer')
print("\n使用 df.join() 后的结果:")
print(df_joined)输出:
M1 RAW M2 BS 999 3.65 A 3.35 999 3.65 A 3.38 999 3.65 A 3.30 999 3.58 B 3.35 999 3.58 B 3.38 999 3.58 B 3.30 999 3.50 C 3.35 999 3.50 C 3.38 999 3.50 C 3.30
可以看到,结果DataFrame的行数从3行变成了9行。这是因为 DataFrame.join()(以及 pd.merge())在处理重复索引时,会执行一个“笛卡尔积”式的连接:对于 df 中每个索引为 999 的行,它会与 df1 中所有索引为 999 的行进行匹配。由于 df 有3个 999 索引的行,df1 也有3个 999 索引的行,最终结果就是 3 * 3 = 9 行。这显然不是我们希望的简单列添加。
当目标是简单地将两个DataFrame的列并排连接起来,并且它们在行数上是等长的,或者希望基于索引进行对齐但不引发笛卡尔积时,pd.concat() 函数是更合适的选择。
pd.concat() 允许我们沿着指定的轴(axis=0 为行,axis=1 为列)连接DataFrame。当 axis=1 时,它会尝试根据索引对齐DataFrame。如果索引完全相同(包括重复值和它们的顺序),pd.concat 会直接将列按位置连接起来。
df_concatenated = pd.concat([df, df1], axis=1)
print("\n使用 pd.concat(axis=1) 后的结果:")
print(df_concatenated)输出:
M1 RAW M2 BS 999 3.65 A 3.35 999 3.58 B 3.38 999 3.50 C 3.30
这个结果正是我们所期望的:M2 列被正确添加,且DataFrame的行数保持不变,每行数据都与其原始位置对应。
理解 pd.concat 和 join/merge 之间的核心差异对于选择正确的Pandas操作至关重要:
pd.concat(objs, axis=1):
DataFrame.join(other, on=None, how='left') 或 pd.merge(left, right, on=None, how='inner'):
在Pandas中添加新列时,选择正确的函数是避免数据处理错误的关健。
理解这些函数的细微差别,将帮助你更高效、更准确地进行Pandas数据操作。
以上就是高效地向Pandas DataFrame添加新列并处理重复索引的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号