python - 如何更新数据框给出元组列表和生成器

标签 python pandas numpy

设置

考虑数据框 df

df = pd.DataFrame(
    np.arange(100).reshape(10, 10),
    list('ABCDEFGHIJ'), list('abcdefghij')
)

df

    a   b   c   d   e   f   g   h   i   j
A   0   1   2   3   4   5   6   7   8   9
B  10  11  12  13  14  15  16  17  18  19
C  20  21  22  23  24  25  26  27  28  29
D  30  31  32  33  34  35  36  37  38  39
E  40  41  42  43  44  45  46  47  48  49
F  50  51  52  53  54  55  56  57  58  59
G  60  61  62  63  64  65  66  67  68  69
H  70  71  72  73  74  75  76  77  78  79
I  80  81  82  83  84  85  86  87  88  89
J  90  91  92  93  94  95  96  97  98  99

元组列表tups

tups = [
    ('A', 'a'), ('A', 'h'), ('B', 'e'), ('C', 'b'),
    ('C', 'i'), ('D', 'f'), ('E', 'c'), ('E', 'j'),
    ('F', 'g'), ('G', 'd'), ('H', 'a'), ('H', 'h'),
    ('I', 'e'), ('J', 'b'), ('J', 'i')
]

生成器 fib

def fib():
    x0 = None
    x1 = None
    while True:
        if x0 is None:
            yield 0
            x0 = 0
        elif x1 is None:
            yield 1
            x1 = 1
        else:
            x0, x1 = x1, x1 + x0
            yield x1

问题

对于 tups 中的每个元组,使用 fib 更新 df 的最有效或优雅的方法是什么,其中每个元组表示 df 其中第一个元素是索引,第二个元素是列?

我做了什么

f = fib()
for row, col in tups:
    df.set_value(row, col, next(f))

df

    a    b   c   d    e   f   g   h    i   j
A   0    1   2   3    4   5   6   1    8   9
B  10   11  12  13    1  15  16  17   18  19
C  20    2  22  23   24  25  26  27    3  29
D  30   31  32  33   34   5  36  37   38  39
E  40   41   8  43   44  45  46  47   48  13
F  50   51  52  53   54  55  21  57   58  59
G  60   61  62  34   64  65  66  67   68  69
H  55   71  72  73   74  75  76  89   78  79
I  80   81  82  83  144  85  86  87   88  89
J  90  233  92  93   94  95  96  97  377  99

最佳答案

查看 DYZ 解决方案,我尝试对其进行一些优化,删除应用和 lambda。我认为这比 DYZ 的解决方案快两倍。

f = fib()
s1 = [next(f) for _ in range(len(tups))]
tall = df.stack()
tall[tups] = s1
tall.unstack()

关于python - 如何更新数据框给出元组列表和生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480584/

相关文章:

python - 当输出很大时如何管理Python中的子进程?

Python:优化数据帧处理

python - Pandas 分层数据框

python - 根据特定标准从图像中选择坐标

python - 合并不同的结果 SQL

python - 每 n 秒更新一个值

python - 在执行一些额外操作的同时将数据帧重新采样为新数据帧

python - 如何根据列将 numpy 数组拆分为 numpy 数组?

python - Sun Grid Engine,强制每个节点执行一项作业

python - SSL 上的 MITM 代理卡在客户端的 wrap_socket 上