
考虑以下场景:我们有一个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.30df['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号