Pandas 按名称和索引大小更改的索引对所有其他列求和

Posted

技术标签:

【中文标题】Pandas 按名称和索引大小更改的索引对所有其他列求和【英文标题】:Pandas sum every other column by index where names, and index size changes 【发布时间】:2019-07-14 10:32:19 【问题描述】:

这是我当前命名的数据框

Date    David_Added David_Removed   Malik_Added Malik_Removed   Meghan_Added    Meghan_Removed  Sucely_Added    Sucely_Removed
02/19/2019  3   1   39  41  1   6   14  24
02/18/2019  0   0   8   6   0   3   0   0
02/16/2019  0   0   0   0   0   0   0   0
02/15/2019  0   0   0   0   0   0   0   0
02/14/2019  0   0   0   0   0   0   0   0
02/13/2019  0   0   0   0   0   0   0   0
02/12/2019  0   0   0   0   0   0   0   0
02/11/2019  0   0   0   0   0   0   0   0
02/08/2019  0   0   0   0   0   0   0   0
02/07/2019  0   0   0   0   0   0   0   0

我需要按日期汇总每个人的数据,显然跳过了日期列。我希望总数是总和列旁边的列。 “User_Add、User_Removed、User_Total”如下图所示。我面临的问题是前缀名称并不总是相同的,并且用户总数会发生变化。 我的思考过程是计算总列数。然后遍历他们进行数学运算,并将结果转储到每个用户的新列中。然后按字母顺序对列进行排序,以便将它们组合在一起。

类似的东西

loops = out.shape[1]
while loop < loops:
    out['User_Total'] = out['User_Added']+out['User_Removed']
    loop += 1
out.sort_index(axis=1, inplace=True)

但是我不确定如何按索引调用整个列,或者这是否是处理它的好方法。

这是我希望输出的样子。

Date    David_Added David_Removed   David_Total Malik_Added Malik_Removed   Malik_Total Meghan_Added    Meghan_Removed  Meghan_Total    Sucely_Added    Sucely_Removed  Sucely_Total
2/19/2019   3   1   4   39  41  80  1   6   7   14  24  38
2/18/2019   0   0   0   8   6   14  0   3   3   0   0   0
2/16/2019   0   0   0   0   0   0   0   0   0   0   0   0
2/15/2019   0   0   0   0   0   0   0   0   0   0   0   0
2/14/2019   0   0   0   0   0   0   0   0   0   0   0   0
2/13/2019   0   0   0   0   0   0   0   0   0   0   0   0
2/12/2019   0   0   0   0   0   0   0   0   0   0   0   0
2/11/2019   0   0   0   0   0   0   0   0   0   0   0   0
2/8/2019    0   0   0   0   0   0   0   0   0   0   0   0
2/7/2019    0   0   0   0   0   0   0   0   0   0   0   0

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

groupbysplit 列一起使用

s=df.groupby(df.columns.str.split('_').str[0],axis=1).sum().drop('Date',1).add_suffix('_Total')
yourdf=pd.concat([df,s],1).sort_index(level=0,axis=1)
yourdf
Out[455]: 
         Date  David_Added      ...       Sucely_Removed  Sucely_Total
0  02/19/2019            3      ...                   24            38
1  02/18/2019            0      ...                    0             0
2  02/16/2019            0      ...                    0             0
3  02/15/2019            0      ...                    0             0
4  02/14/2019            0      ...                    0             0
5  02/13/2019            0      ...                    0             0
6  02/12/2019            0      ...                    0             0
7  02/11/2019            0      ...                    0             0
8  02/08/2019            0      ...                    0             0
9  02/07/2019            0      ...                    0             0
[10 rows x 13 columns]

【讨论】:

【参考方案2】:

或者:

df.join(df.T.groupby(df.T.index.str.split("_").str[0]).sum().T.iloc[:,1:].add_suffix('_Total'))

        Date  David_Added  David_Removed  Malik_Added  Malik_Removed  \
0  02/19/2019            3              1           39             41   
1  02/18/2019            0              0            8              6   
2  02/16/2019            0              0            0              0   
3  02/15/2019            0              0            0              0   
4  02/14/2019            0              0            0              0   
5  02/13/2019            0              0            0              0   
6  02/12/2019            0              0            0              0   
7  02/11/2019            0              0            0              0   
8  02/08/2019            0              0            0              0   
9  02/07/2019            0              0            0              0   

   Meghan_Added  Meghan_Removed  Sucely_Added  Sucely_Removed David_Total  \
0             1               6            14              24           4   
1             0               3             0               0           0   
2             0               0             0               0           0   
3             0               0             0               0           0   
4             0               0             0               0           0   
5             0               0             0               0           0   
6             0               0             0               0           0   
7             0               0             0               0           0   
8             0               0             0               0           0   
9             0               0             0               0           0   

  Malik_Total Meghan_Total Sucely_Total  
0          80            7           38  
1          14            3            0  
2           0            0            0  
3           0            0            0  
4           0            0            0  
5           0            0            0  
6           0            0            0  
7           0            0            0  
8           0            0            0  
9           0            0            0

【讨论】:

看起来它不起作用,因为我的错误。没有意识到我将 CSV 作为字符串导入。这在进行更改后也有效。 很高兴知道这一点。 :)【参考方案3】:

我知道我的这不是对 OP 提出的问题的答案,而是关于可以解决他面临的问题的更好做法的建议。

你有一个结构性问题。将您的数据框建模为:

Date User_Name User_Added User_Removed User_Total

除了处理可变数量的用户之外,您输入的代码还可以解决您的问题。

【讨论】:

以上是关于Pandas 按名称和索引大小更改的索引对所有其他列求和的主要内容,如果未能解决你的问题,请参考以下文章

从 Pandas 的索引中检索列的名称

MySQL 索引未按预期使用

Pandas 使用索引名称作为列名创建 Dataframe

Python pandas 按多个索引范围切片数据帧

使用 Grouper 的 pandas 系列日期时间索引中的月份名称

Sort_values Pandas 按索引排序?