gpt4 book ai didi

python - 为 Pandas 数据框中的每一行选择切片/列范围

转载 作者:行者123 更新时间:2023-11-28 21:38:55 26 4
gpt4 key购买 nike

问题是:

import numpy
import pandas

dfl = pandas.DataFrame(numpy.random.randn(30,10))

现在,我想将以下单元格放入数据框中:

  • 对于第 1 行:第 3 至 6 列(长度 = 4 个单元格),
  • 对于第 2 行:第 4 至 7 列(长度 = 4 个单元格),
  • 对于第 3 行:第 1 至 4 列(长度 = 4 个单元格),
  • 等...

这些范围中的每一个始终是 4 个单元格宽,但开始/结束是不同的列。

行式起点在列表 [3, 4, 1,...] 中,行式终点也是如此。我感兴趣的行列表也是一个列表 [1, 2, 3]

最后,dfl 有一个我想保留的日期时间索引 (意味着最终结果应该是一个索引为 dfl.index[1, 2, 3] 的数据框。

编辑:范围超出

行起点向量的某些条目太大(比如上面示例矩阵中的行起点 9)。在这种情况下,我只需要从行开始点开始的所有列,然后根据需要使用尽可能多的 NaN 以获得正确的形状(因此自 9+4 > 10 以来,相应的行结果数据框应为 [9, 10, NaN, NaN]

最佳答案

使用 NumPy broadcasting创建所有这些列索引,然后 advanced-indexing进入数组数据 -

def extract_rows(dfl, starts, L, fillval=np.nan):
a = dfl.values

idx = np.asarray(starts)[:,None] + range(L)
valid_mask = idx < dfl.shape[1]
idx[~valid_mask] = 0

val = a[np.arange(len(idx))[:,None],idx]
return pd.DataFrame(np.where(valid_mask, val, fillval))

样本运行-

In [541]: np.random.seed(0)

In [542]: dfl = pandas.DataFrame(numpy.random.randint(11,99,(3,10)))

In [543]: dfl
Out[543]:
0 1 2 3 4 5 6 7 8 9
0 55 58 75 78 78 20 94 32 47 98
1 81 23 69 76 50 98 57 92 48 36
2 88 83 20 31 91 80 90 58 75 93

In [544]: extract_rows(dfl, starts=[3,4,8], L=4, fillval=np.nan)
Out[544]:
0 1 2 3
0 78.0 78.0 20.0 94.0
1 50.0 98.0 57.0 92.0
2 75.0 93.0 NaN NaN

In [545]: extract_rows(dfl, starts=[3,4,8], L=4, fillval=-1)
Out[545]:
0 1 2 3
0 78 78 20 94
1 50 98 57 92
2 75 93 -1 -1

关于python - 为 Pandas 数据框中的每一行选择切片/列范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com