pandas dataframe:如何基于列的值聚合行的子集

时间:2019-04-17 12:47:11

标签: python pandas dataframe

我有一个这样的熊猫数据框:

      value
lab        
A        50
B        35
C         8
D         5
E         1
F         1

这只是一个示例,实际的数据帧较大,但是遵循相同的结构。
使用以下两行创建了示例数据框:

df = pd.DataFrame({'lab':['A', 'B', 'C', 'D', 'E', 'F'], 'value':[50, 35, 8, 5, 1, 1]})
df = df.set_index('lab')

我想汇总其值小于给定阈值的行:所有这些行都应替换为一行,其值为替换行的总和。

例如,如果我选择阈值= 6,则预期结果应为:

      value
lab        
A        50
B        35
C         8
X         7 #sum of D, E, F

我该怎么做?

我本来想使用groupby(),但是我看到的所有示例都涉及到使用单独的列进行分组,因此在这种情况下我不知道如何使用它。
通过执行loc,我可以使用df.loc[df['value'] < threshold]选择小于阈值的行,但是我不知道如何只对这些行求和,而其余数据框保持不变。

2 个答案:

答案 0 :(得分:7)

您可以使用lambdaDataFrame.append以“单一模式”实现这一目标:

thresh = 6

(df[lambda x: x['value'] >= thresh]
 .append(df[lambda x: x['value'] < thresh].sum().rename('X')))

或者,如果您愿意

mask = df['value'].ge(thresh)

df[mask].append(df[~mask].sum().rename('X'))

[出]

     value
lab       
A       50
B       35
C        8
X        7

答案 1 :(得分:5)

setting with enlargement与经过过滤的order(On, Way) { this.loading = true; // let newArray = []; this.orderItems = On; this.orderWay = Way; if ((this.orderWay = "desc")) { newArray = _.orderBy(this.items, this.orderItems, "desc"); } else { newArray = _.orderBy(this.items, this.orderItems, "asc"); } this.items = newArray; this.loading = false; } 一起使用:

DataFrame

另一种解决方案:

threshold = 6
m = df['value'] < threshold
df1 = df[~m].copy()
df1.loc['Z'] = df.loc[m, 'value'].sum()

print (df1)
     value
lab       
A       50
B       35
C        8
Z        7