我当前有一个包含三列的数据框

colc fpc lpc
1 3 5
4 7 8

诸若此类.FPC和LPC可以是NAN,而CoLC是整数.我需要把这个变成表格

a b
1 3
1 4
1 5
4 7
4 8

因为这些是矩阵的行和列索引.

我目前使用以下代码来转换原始的框架.

def unstack_pixels(pix, fpc, lpc, colc = 'col_2'):
    
    a = pix[[colc, fpc, lpc]].dropna(how='any')

    return np.column_stack([
            np.repeat(a[colc], a[lpc] - a[fpc] + 1),
            np.concatenate([
                np.arange(start, stop + 1) for start, stop 
                    in zip(a[fpc], a[lpc])
            ])
        ])

但我不确定这是不是最有效的方法...

推荐答案

您可以使用repeatnumpy.r_结合zip+itertools.starmap来生成索引器:

from itertools import starmap

# if NaNs:
df = df.dropna()

out = pd.DataFrame({'a': df['colc'].repeat(df['lpc']-df['fpc']+1),
                    'b': np.r_[tuple(starmap(slice, zip(df['fpc'], df['lpc']+1)))],
                    })

或使用repeatgroupby.cumcount:

n = df['lpc'].sub(df['fpc']).add(1).fillna(0)

out = pd.DataFrame({'a': df['colc'].repeat(n),
                    'b': df['fpc'].repeat(n)
                           .pipe(lambda s: s+s.groupby(level=0).cumcount()),
                    })

输出:

   a  b
0  1  3
0  1  4
0  1  5
1  4  7
1  4  8

Python-3.x相关问答推荐

使用具有相同索引的多次出现的索引列表更新NumPy数组

ValueError at /register/ 视图authenticate.views.register_user 未返回HttpResponse 对象.它返回 None 相反

将自定义函数应用于 pandas 数据框的每一列

匹配语句NaN

torch.stack([t1, t1, t1], dim=1)与torch.hstack([t1, t1, t1])之间有什么区别?

如何确保 GCP Document AI 模型输出与输入文件同名的 JSON?

嵌套协议的使用(协议成员也是协议)

在 Python 中实现 COM 接口

Keras 中 Conv2D 层的意外结果

为什么 numpy 的 `np.char.encode` 会将一个空的 unicode 数组变成一个空的 `float64` 数组?

如何在带有 GUI 的 python 游戏中设置回答时间限制?

删除括号和大括号中不必要的空格

python 3:如何判断一个对象是否是一个函数?

Pandas 将列格式化为货币

TensorFlow:dataset.train.next_batch 是如何定义的?

使用 Sympy 方程进行绘图

Tensorflow:ImportError:libcudnn.so.7:无法打开共享对象文件:没有这样的文件或目录

python 内置的 __exit__ 参数类型是什么?

BeautifulSoup 的 Python 3 兼容性

哪个更有效:Python 文档字符串还是类型提示?