每 N 列汇总值
Summarize values every N columns
来自这个数据框:
|-|----|---|---|---|---|---|---|---|---|
| |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 |
|-|----|---|---|---|---|---|---|---|---|
我想得到那个:
|-|----|-----|-----|
| |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 个月在 Trimester-1 中汇总。
M-4、M-5、M-6 总结在 T-2
我们缺少 M-9 来添加列 T-3...所以我们删除了 M-7 和 M-8。
在此示例中,输入数据帧一直到 M-8,但它可能一直到 M-1 或直到 M-12。
假设每组 3 列按顺序排列月份,您可以使用:
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
):
group = (df.columns[1:].str[2:].astype(int)-1)%3+1
(df.set_index('code')
.groupby(group, axis=1)
.sum()
.add_prefix('T-')
)
输出:
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
静态代码可能不起作用,因为正如您提到的列数可能会有所不同,这适用于任何给定的列数
示例输入:
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
创建另一个数据框 df1
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
可能会出现警告忽略它
输出:
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
0。案例研究
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)
# 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)
# 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)
来自这个数据框:
|-|----|---|---|---|---|---|---|---|---|
| |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 |
|-|----|---|---|---|---|---|---|---|---|
我想得到那个:
|-|----|-----|-----|
| |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 个月在 Trimester-1 中汇总。
M-4、M-5、M-6 总结在 T-2
我们缺少 M-9 来添加列 T-3...所以我们删除了 M-7 和 M-8。
在此示例中,输入数据帧一直到 M-8,但它可能一直到 M-1 或直到 M-12。
假设每组 3 列按顺序排列月份,您可以使用:
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
):
group = (df.columns[1:].str[2:].astype(int)-1)%3+1
(df.set_index('code')
.groupby(group, axis=1)
.sum()
.add_prefix('T-')
)
输出:
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
静态代码可能不起作用,因为正如您提到的列数可能会有所不同,这适用于任何给定的列数
示例输入:
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
创建另一个数据框 df1
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
可能会出现警告忽略它 输出:
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
0。案例研究
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)
# 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)
# 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)