我正在通过在同一行中添加列来制作一个动态表,然而,列的范围是基于两个列Colum_Start和Colum_Stop来确定的:

df = pd.DataFrame({
   'Name': ['Apple', 'Banana', 'Orange', 'Cherry', 'Egg', 'Cheese'],
   'ID': ['F1', 'F1', 'F1', 'F1', 'V1', 'V2'],
  '202101': [1, 10, 20, 30, 40, 50],
  '202102': [20, 15, 12, 18, 32, 12],
  '202103': [3, 11, 25, 32, 13, 4],
  '202104': [32, 11, 9, 82, 2, 1],
  '202105': [9, 5, 11, 11, 2, 5],
  'colum_start ': [202102, 202101, 202102, 202103, 202101, 202103],
  'colum_stop': [202105, 202103, 202105, 202104, 202102, 202105],
})
df

enter image description here

我想创建一个SUM_COLUMN,它根据列名中的COLUM_START和COLUM_STOP对列求和.

desired output:

enter image description here

感谢您的帮助!!

推荐答案

对两列之间按列比较的 Select 值使用数字广播,并对1的链接累计和进行比较:

a = df['colum_start'].astype(str).to_numpy()[:, None]
b = df['colum_stop'].astype(str).to_numpy()[:, None]
c = df.columns.to_numpy()

mask = (np.cumsum(c == a, axis=1) == 1) & (np.cumsum(c[::-1] == b, axis=1)[:, ::-1] == 1)

df['SUM_OF_RANGE'] = df.where(mask, 0).sum(axis=1)
print (df)

     Name  ID  202101  202102  202103  202104  202105  colum_start  \
0   Apple  F1       1      20       3      32       9       202102   
1  Banana  F1      10      15      11      11       5       202101   
2  Orange  F1      20      12      25       9      11       202102   
3  Cherry  F1      30      18      32      82      11       202103   
4     Egg  V1      40      32      13       2       2       202101   
5  Cheese  V2      50      12       4       1       5       202103   

   colum_stop SUM_OF_RANGE  
0      202105           64  
1      202103           36  
2      202105           57  
3      202104          114  
4      202102           72  
5      202105           10  
    

如果小数据和性能不重要,请使用DataFrame.loc:

c = df.columns.to_numpy()

df['SUM_OF_RANGE'] = [df.loc[i, str(a):str(b)].sum() 
                      for i, a, b in zip(df.index, df['colum_start'], df['colum_stop'])]
print (df)
     Name  ID  202101  202102  202103  202104  202105  colum_start  \
0   Apple  F1       1      20       3      32       9       202102   
1  Banana  F1      10      15      11      11       5       202101   
2  Orange  F1      20      12      25       9      11       202102   
3  Cherry  F1      30      18      32      82      11       202103   
4     Egg  V1      40      32      13       2       2       202101   
5  Cheese  V2      50      12       4       1       5       202103   

   colum_stop  SUM_OF_RANGE  
0      202105            64  
1      202103            36  
2      202105            57  
3      202104           114  
4      202102            72  
5      202105            10  

Python-3.x相关问答推荐

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

在BaseHTTPRequestHandler中填充和返回列表

汉明距离:涉及按位运算的逻辑步骤不清楚

不同的焦点顺序和堆叠顺序 tkinter

python3,将整数转换为字节:对于小整数使用 to_bytes() 有哪些替代方法?

它们是否同样存储在python3的内存中?

提高时间复杂度的一些建议

Python ** 用于负数

合并问卷中多列中的稀疏问题 - Pandas

ImportError:无法从jinja2导入名称escape

Python3 AttributeError:列表对象没有属性清除

TimescaleDB:是否可以从 Python 调用create_hypertable?

为什么在 Python 中不推荐使用 MutableString?

如何在 python 3.x 中禁用 ssl 判断?

python setup.py egg_info mysqlclient

如何区分文件之类的对象和文件路径之类的对象

警告:请使用 tensorflow/models 中的官方/mnist/dataset.py 等替代方案

同步调用协程

在 macbook pro M1 上安装 Tensorflow 时出现zsh:非法硬件指令 python

如何从 seaborn / matplotlib 图中删除或隐藏 x 轴标签