按条件定义的组汇总数据帧

时间:2018-04-27 04:30:46

标签: python pandas dataframe sum rows

我有python数据帧,我想在不同的行之间求和,用数字0分隔。例如:我在这里有这个DF:

const discord = require('discord.js');
var bot = new discord.Client();

bot.on(`guildMemberAdd`, member => {
    var dC= member.guild.channels.find("name", "CHANNEL_NAME");
    /* Using dC for short. */

    if (dC) {
        dC.send(`${member.username}, welcome to the server!`);
    } else {
        member.guild.defaultChannel.send(`${member.username}, welcome to the server!`);
    }
});

我想生成这个DF:

data= DataFrame({'A':['a','b','c','d','e','f','g','h','i'],'B':[1,2,0,3,2,0,0,3,4]})

1 个答案:

答案 0 :(得分:1)

一种可能的方法是使用函数cumsum定义一些组:

data = pd.DataFrame({'A':['a','b','c','d','e','f','g','h','i'],'B':[1,2,0,3,2,0,0,3,4]})
data['groups'] = (data['B'] == 0).cumsum() 
# Out 
#    A  B  groups
# 0  a  1       0
# 1  b  2       0
# 2  c  0       1
# 3  d  3       1
# 4  e  2       1
# 5  f  0       2
# 6  g  0       3
# 7  h  3       3
# 8  i  4       3

然后,定义一个带有输出索引的数组,除第一个数组外,每个组的第一个匹配项下面都有一个:

indexes = data.loc[data.drop_duplicates('groups').index.values+1]['A'].values
indexes[0] = data['A'].values[0]

最后,通过对每个组的列a进行分组并分配新的AA列进行分组。

sum_data = data.groupby('groups').sum().assign(AA=indexes).reset_index(drop=True)
# Out
#    B AA
# 0  3  a
# 1  5  d
# 2  0  g
# 3  7  h

如果存在[2,0,g]行是令人讨厌的话,可以添加最后一行:

sum_data = sum_data[sum_data['B'] != 0]
# Out
#    B AA
# 0  3  a
# 1  5  d
# 3  7  h