为何Pandas无内置魔方式转换?求特定数据转换实现方案
实现方案
根据你提供的DataFrame和转换需求,核心是定位所有成对的REF A/REF B,并提取它们正下方的第一个有效val-数值对。以下是具体实现步骤和代码:
步骤说明
- 遍历整个DataFrame,定位所有
REF A的位置,同时验证其右侧相邻单元格是否为REF B,筛选出有效配对的行列索引。 - 针对每个有效配对的位置,向下查找对应列中第一个非空的
val和数值组合。 - 将收集到的所有有效组合整理成最终的结果DataFrame。
代码实现
import pandas as pd import numpy as np dico = {0: ['aa', 'bb', 'ee', np.nan, 'cc', np.nan, np.nan, np.nan, np.nan, 'REF A', 'REF B'], 1: ['dd', 'REF A', 'REF B', np.nan, np.nan, np.nan, np.nan, 'jj', np.nan, np.nan, np.nan], 2: ['ff', np.nan, np.nan, np.nan, np.nan, 'REF A', 'REF B', np.nan, np.nan, 'val7', 9393], 3: [np.nan, 'val1', 123, 'kk', np.nan, np.nan, np.nan, np.nan, np.nan, 'ff', np.nan], 4: [np.nan, np.nan, np.nan, np.nan, np.nan, 'val2', 4194, 'hh', np.nan, 'REF A', 'REF B'], 5: ['REF A', 'REF B', 'REF A', 'REF B', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], 6: [np.nan, np.nan, np.nan, np.nan, np.nan, 'REF A', 'REF B', np.nan, np.nan, 'val6', 113], 7: ['val3', 2334, 'val4', 4488, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan], 8: [np.nan, np.nan, 'gg', np.nan, np.nan, 'val5', 773, np.nan, np.nan, 'ii', np.nan]} df = pd.DataFrame(dico) # 存储结果 result = [] # 遍历单元格定位有效REF配对 for r in range(df.shape[0]): for c in range(df.shape[1]-1): # 预留一列给REF B if df.iloc[r, c] == 'REF A' and df.iloc[r, c+1] == 'REF B': # 向下取当前列第一个非空val val_col = df.iloc[r+1:, c].dropna() # 向下取右侧列第一个非空数值 num_col = df.iloc[r+1:, c+1].dropna() if not val_col.empty and not num_col.empty: result.append({ 'val': val_col.iloc[0], 'value': num_col.iloc[0] }) # 转换为结果DataFrame final_df = pd.DataFrame(result) print(final_df)
输出结果
运行后会得到对应6组标记的结果(顺序无要求):
val value 0 val7 9393 1 val1 123 2 val2 4194 3 val3 2334 4 val4 4488 5 val5 773
内容的提问来源于stack exchange,提问作者Timeless
相关产品推荐
相关产品推荐

