python:基于数据帧中的位置对特定行值求和

2024-05-01 22:08:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧:

df

    Name    A   B   C   D
0   Americas
1   Mark    1   2   3   4
2   Mat     5   6   7   8
3   ANZ
4   Pat     9   1   2   3
5   Pacific
6   Zack    4   5   6   7
7   Zoey    8   9   1   2
8   Zee     3   4   5   6

此处按第1行与第2行之和计算

澳新银行按第4行之和计算

太平洋按第6行与第8行之和计算

注意:这些行号是常量,不依赖于任何标准,而是按原样使用。

计算各列总计的方法如下所示:

df.at[5, 'A'] = df['A'].loc[6:8].sum()
df.at[5, 'B'] = df['B'].loc[6:8].sum()
df.at[5, 'C'] = df['C'].loc[6:8].sum()
df.at[5, 'D'] = df['D'].loc[6:8].sum()

有没有一种方法可以不用三行代码就可以做到这一点

结果数据帧:

df

    Name        A   B   C   D
0   Americas    6   8   10  12
1   Mark        1   2   3   4
2   Mat         5   6   7   8
3   ANZ         9   1   2   3
4   Pat         9   1   2   3
5   Pacific     15  18  12  15
6   Zack        4   5   6   7
7   Zoey        8   9   1   2
8   Zee         3   4   5   6

2条回答

我将使用isnaall查找缺少的行,并使用cumsum创建组。然后在groupbytransformsum中使用它。使用fillna填充缺少的值

g = df[['A','B','C','D']].isna().all(axis=1).cumsum()
df = df.fillna(df.groupby(g)[['A','B','C','D']].transform('sum'))
print (df)
       Name     A     B     C     D
0  Americas   6.0   8.0  10.0  12.0
1      Mark   1.0   2.0   3.0   4.0
2       Mat   5.0   6.0   7.0   8.0
3       ANZ   9.0   1.0   2.0   3.0
4       Pat   9.0   1.0   2.0   3.0
5   Pacific  15.0  18.0  12.0  15.0
6      Zack   4.0   5.0   6.0   7.0
7      Zoey   8.0   9.0   1.0   2.0
8       Zee   3.0   4.0   5.0   6.0

First find让我们使用isnull布尔值查找需要填充的列

然后,我们为groupby创建一个条件列

由于您希望返回原始数据帧,因此我们可以使用iloc沿索引重新分配值

idx = df[df['A'].isnull()].index

#Int64Index([0, 3, 5], dtype='int64')

df.loc[idx,'Key'] = df['Name']
df['Key'] = df['Key'].ffill()


df.iloc[idx,1:-1] = df.drop('Name',axis=1).groupby('Key').transform('sum').loc[idx]

print(df.drop('Key',axis=1))

       Name     A     B     C     D
0  Americas   6.0   8.0  10.0  12.0
1      Mark   1.0   2.0   3.0   4.0
2       Mat   5.0   6.0   7.0   8.0
3       ANZ   9.0   1.0   2.0   3.0
4       Pat   9.0   1.0   2.0   3.0
5   Pacific  15.0  18.0  12.0  15.0
6      Zack   4.0   5.0   6.0   7.0
7      Zoey   8.0   9.0   1.0   2.0
8       Zee   3.0   4.0   5.0   6.0

相关问题 更多 >