首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇总每个N列的值

汇总每个N列的值
EN

Stack Overflow用户
提问于 2022-01-26 19:01:20
回答 3查看 122关注 0票数 1

从这个数据中:

代码语言:javascript
复制
|-|----|---|---|---|---|---|---|---|---|
| |code|M-1|M-2|M-3|M-4|M-5|M-6|M-7|M-8|
|-|----|---|---|---|---|---|---|---|---|
|0| DE | 3 | 0 | 5 | 7 | 0 | 2 | 1 | 9 |
|1| GT | 5 | 2 | 2 | 1 | 0 | 3 | 1 | 7 |
|2| KT | 8 | 2 | 0 | 3 | 0 | 7 | 0 | 3 |
|3| SZ | 0 | 2 | 3 | 2 | 5 | 4 | 0 | 2 |
|4| NJ | 7 | 3 | 3 | 0 | 2 | 1 | 0 | 1 |
|5| DC | 1 | 0 | 3 | 0 | 8 | 1 | 0 | 0 |
|-|----|---|---|---|---|---|---|---|---|

我想知道:

代码语言:javascript
复制
|-|----|-----|-----|
| |code| T-1 | T-2 |
|-|----|-----|-----|
|0| DE |  8  |  9  |
|1| GT |  9  |  4  |
|2| KT | 10  | 10  |
|3| SZ |  5  | 11  |
|4| NJ | 13  |  3  |
|5| DC |  4  |  9  |
|-|----|-----|-----|

月-1,月-2,月-3是总结在三个月-1。

M-4,M-5,M-6概括在T-2中。

我们没有M-9来增加T-3列.所以我们删除了M-7和M-8。

在本例中,输入数据一直到M-8,但可能一直到M-1或M-12.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-26 19:16:51

静态代码可能无法工作,因为正如您前面提到的,列数可能会因任何给定的列数而有所不同。

示例输入:

代码语言:javascript
复制
  code  M-1  M-2  M-3  M-4  M-5  M-6
0   DE    8    9   10    9   10    9
1   GT    9    4    8    4    8    4
2   KT   10   10    3   10    3   10
3   SZ    5   11    2   11    2   11
4   NJ   13    3    1    3    1    3
5   DC    4    9    0    9    0    9

创建另一个dataframe df1

代码语言:javascript
复制
df1=df[df.columns[:1]]
for x in range(len(df.columns[1:])//3):
     df1["T-"+str(x+1)]=df[df.columns[x*3+1:(x+1)*3+1]].sum(axis=1)
df1

可能会出现一个警告,忽略它的输出:

代码语言:javascript
复制
  code  T-1  T-2
0   DE   27   28
1   GT   21   16
2   KT   23   23
3   SZ   18   24
4   NJ   17    7
5   DC   13   18
票数 1
EN

Stack Overflow用户

发布于 2022-01-26 19:14:30

假设每组3列有几个月的时间,您可以使用:

代码语言:javascript
复制
import numpy as np

group = np.arange(len(df.columns)-1)//3+1

(df.set_index('code')
   .groupby(group, axis=1) 
   .sum()
   .add_prefix('T-')
)

如果您想从可能未排序的列(例如,M-4->T-2)的列名中提取trimester:

代码语言:javascript
复制
group = (df.columns[1:].str[2:].astype(int)-1)%3+1

(df.set_index('code')
   .groupby(group, axis=1) 
   .sum()
   .add_prefix('T-')
)

产出:

代码语言:javascript
复制
      T-1  T-2  T-3
code               
DE      8    9   10
GT      9    4    8
KT     10   10    3
SZ      5   11    2
NJ     13    3    1
DC      4    9    0
票数 -1
EN

Stack Overflow用户

发布于 2022-01-27 10:48:06

0。案例研究

代码语言:javascript
复制
import pandas as pd

histo = {
        "article_code" : ["DE", "GT", "KT", "SZ", "NJ", "DC"],
        "M-1" : [3, 5, 8, 0, 7, 1],
        "M-2" : [0, 2, 2, 2, 3, 0],
        "M-3" : [5, 2, 0, 3, 3, 3],
        "M-4" : [7, 1, 3, 2, 0, 0],
        "M-5" : [0, 0, 0, 5, 2, 8],
        "M-6" : [2, 3, 7, 4, 1, 1],
        "M-7" : [1, 1, 0, 0, 0, 0],
        "M-8" : [9, 7, 3, 2, 1, 0]
        }

df = pd.DataFrame(histo)
print(df)

1.方法矢量化(使用groupby)

代码语言:javascript
复制
# All columns must be the months we want to group
df.set_index("article_code", inplace=True)
print(df)

# Prepare the groupby function
m_number = len(df.columns)
splitter = [x//3 for x in range(0, m_number)]
print(splitter)

# Sum per trimester
df = df.groupby(by=splitter, axis=1).sum()
print(df)

# Remove non full trimester and rename columns
t_number = m_number//3
df = df.iloc[:,:t_number]
df.columns = ["T-" + str(x + 1) for x in range(0,m_number//3)]
print(df)

2.具有循环的方法(使用iloc)

代码语言:javascript
复制
# Record the number of months 
m_number = len(df.columns) - 1

# Add sums per full trimester
for inc_t, inc_m in enumerate(range(1, (m_number//3)*3, 3)):
    df["T-" + str(inc_t + 1)] = df.iloc[:,inc_m:inc_m+3:1].sum(axis=1)
print(df)

# Delete months
df = df.iloc[:,:1].merge(right=df.iloc[:,-inc_t-1:], how="left",
                         left_index=True, right_index=True)
print(df)
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70868894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档