我有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]})
答案 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