考虑以下场景:我们有一个dataframe df,其索引(例如'bs'列)包含重复值,并且我们希望从另一个dataframe df1中添加一列新的数据(例如'm2'),该dataframe df1也具有相同的重复索引结构。
初始DataFrame df 示例:
BS | M1 | RAW |
---|---|---|
999 | 3.65 | A |
999 | 3.58 | B |
999 | 3.50 | C |
我们希望添加新列'M2'后得到以下结构:
BS | M1 | M2 | RAW |
---|---|---|---|
999 | 3.65 | 3.35 | A |
999 | 3.58 | 3.38 | B |
999 | 3.50 | 3.30 | C |
如果尝试使用 df.join(df1, on='BS', how='outer'),结果往往不尽如人意。这是因为 join(或 merge)操作在处理重复索引时,会尝试将左侧DataFrame中每个具有相同索引值的行与右侧DataFrame中所有具有相同索引值的行进行匹配,从而产生笛卡尔积。
以下是导致错误结果的代码示例:
import pandas as pd # 初始DataFrame df value_df = {'M1': [3.65, 3.58, 3.5], 'BS': [999, 999, 999], 'RAW':['A', 'B', 'C']} df = pd.DataFrame(value_df).set_index('BS') # 包含新列M2的DataFrame df1 value_df1 = {'M2': [3.35, 3.38, 3.3], 'BS': [999, 999, 999]} df1 = pd.DataFrame(value_df1).set_index('BS') print("原始 df:") print(df) print("\n待添加的 df1:") print(df1) # 错误的使用 join 方法 df_joined_wrong = df.join(df1, on='BS', how='outer') print("\n使用 df.join() 后的错误结果:") print(df_joined_wrong)
运行上述代码,会发现输出结果的行数从3行膨胀到了9行,新列'M2'的数据与原始'M1'和'RAW'的数据产生了错误的组合:
原始 df: M1 RAW BS 999 3.65 A 999 3.58 B 999 3.50 C 待添加的 df1: M2 BS 999 3.35 999 3.38 999 3.30 使用 df.join() 后的错误结果: 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的索引结构相同,且我们希望按位置(即行顺序)将它们横向拼接时,pd.concat 是更合适的选择。pd.concat 函数通过指定 axis=1 来实现列方向的拼接。它会根据索引进行对齐,如果索引完全匹配(包括重复索引的顺序),则能正确地将列添加到现有DataFrame中,而不会产生笛卡尔积。
import pandas as pd # 初始DataFrame df value_df = {'M1': [3.65, 3.58, 3.5], 'BS': [999, 999, 999], 'RAW':['A', 'B', 'C']} df = pd.DataFrame(value_df).set_index('BS') # 包含新列M2的DataFrame df1 value_df1 = {'M2': [3.35, 3.38, 3.3], 'BS': [999, 999, 999]} df1 = pd.DataFrame(value_df1).set_index('BS') # 使用 pd.concat 进行正确的列添加 df_correct = pd.concat([df, df1], axis=1) print("\n使用 pd.concat() 后的正确结果:") print(df_correct)
运行上述代码,将得到期望的正确结果:
使用 pd.concat() 后的正确结果: M1 RAW M2 BS 999 3.65 A 3.35 999 3.58 B 3.38 999 3.50 C 3.30
df['M2'] = df1['M2'].values # 或者 df['M2'] = [3.35, 3.38, 3.3]
这种方法要求新数据与现有DataFrame的行是严格按位置对应的,不依赖于索引对齐。
在Pandas中向具有重复索引的DataFrame添加新列时,理解不同操作的底层逻辑至关重要。当目标是按现有行的顺序进行列扩展,且两个DataFrame的索引结构(包括重复索引的顺序)一致时,pd.concat([df1, df2], axis=1) 是避免笛卡尔积、实现精确数据合并的推荐方法。相比之下,join 或 merge 更适用于需要复杂匹配逻辑的场景。根据具体的数据结构和合并需求,选择最合适的Pandas函数能够显著提高数据处理的效率和准确性。
以上就是Pandas DataFrame重复索引列的正确添加方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号