如何高效替换DataFrame中符合条件的列值为3个新列数据?
解决方法
步骤1:构造示例数据
首先导入pandas并创建你提供的初始数据和对应表格:
import pandas as pd # 初始DataFrame df_initial = pd.DataFrame({ 'Ch': ['A', 'A', 'B', 'B'], 'Time': ['1 min', '1 min', '2 min', '2 min'] }) # Ch=A对应的3列表格 df_A = pd.DataFrame({ 'A1': [1, 2, 1], 'A2': [2, 3, 1], 'A3': [3, 4, 2] }) # Ch=B对应的3列表格 df_B = pd.DataFrame({ 'B1': [1, 1], 'B2': [2, 1], 'B3': [1, 1] })
步骤2:统一列名
将A、B表格的列名替换为目标列名ColA、ColB、ColC,方便后续合并:
df_A_renamed = df_A.rename(columns={'A1': 'ColA', 'A2': 'ColB', 'A3': 'ColC'}) df_B_renamed = df_B.rename(columns={'B1': 'ColA', 'B2': 'ColB', 'B3': 'ColC'})
步骤3:重复表格数据
按照需求,将A、B表格各自重复两次:
# 重复A表格两次并重置索引 df_A_repeated = pd.concat([df_A_renamed] * 2, ignore_index=True) # 重复B表格两次并重置索引 df_B_repeated = pd.concat([df_B_renamed] * 2, ignore_index=True)
步骤4:合并结果
将重复后的A、B表格合并,得到最终目标DataFrame:
result = pd.concat([df_A_repeated, df_B_repeated], ignore_index=True)
最终结果
运行后result的内容如下:
| ColA | ColB | ColC |
|---|---|---|
| 1 | 2 | 3 |
| 2 | 3 | 4 |
| 1 | 1 | 2 |
| 1 | 2 | 3 |
| 2 | 3 | 4 |
| 1 | 1 | 2 |
| 1 | 2 | 1 |
| 1 | 1 | 1 |
| 1 | 2 | 1 |
| 1 | 1 | 1 |
补充说明
如果你的需求是原DataFrame中每一行Ch=A对应展开为A表格的所有数据,再整体重复两次(比如原2行A对应2*3=6行,再重复两次得到12行A数据),可以用以下代码实现:
# 计算原DataFrame中Ch=A的行数 count_A = len(df_initial[df_initial['Ch'] == 'A']) # 将A表格的每一行重复count_A次,得到展开后的A数据 df_A_expanded = df_A_renamed.loc[df_A_renamed.index.repeat(count_A)] # 重复两次展开后的A数据 df_A_final = pd.concat([df_A_expanded] * 2, ignore_index=True) # 同理处理Ch=B的情况 count_B = len(df_initial[df_initial['Ch'] == 'B']) df_B_expanded = df_B_renamed.loc[df_B_renamed.index.repeat(count_B)] df_B_final = pd.concat([df_B_expanded] * 2, ignore_index=True) # 合并结果 result = pd.concat([df_A_final, df_B_final], ignore_index=True)
内容的提问来源于stack exchange,提问作者user21214736
相关产品推荐
相关产品推荐

