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

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相关问答推荐

如何有效地计算Kernel/Matrix

按小时和日期对Pandas 数据帧进行分组

如何强调您正在寻求以 pandas 数据帧的另一列为条件的差异?

Python根据条件从多行读取值

Django中自动设置/更新字段

根据按不同列中的值分组的平均值划分 DataFrame

使用 Python 在特定组的列中设置上限

如何键入提示函数,在 Python 中通过类decorator 添加到类中

删除给定数组中所有元素为True的所有子数组

如何将虚拟变量列转换为多列?

运行 PyCharm 测试时如何解决django.core.exceptions.ImproperlyConfigured:找不到 GDAL 库?

如何为 Python 中的线程设置异步事件循环?

如何调试垂死的 Jupyter Python3 内核?

Python中的多行日志(log)记录

从大字典中弹出 N 项的最快方法

Pyodbc:登录超时错误

pdfminer python 3.5

带有数千个逗号刻度标签的 MatPlotLib 美元符号

如何为 Python 3.x 安装 psycopg2?

如何在 QGraphicsView 中启用平移和zoom