![](/img/trans.png)
[英]How to assign a value to a column for a subset of dataframe based on a condition in Pandas?
[英]pandas dataframe: how to aggregate a subset of rows based on value of a column
我有一个如下结构的熊猫数据框:
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()
,但是我看到的所有示例都涉及使用单独的列进行分组,所以我不知道在这种情况下如何使用它。
通过执行df.loc[df['value'] < threshold]
我可以使用loc
选择小于我的阈值的行,但我不知道如何仅对这些行求和而保留数据帧的其余部分不变。
您可以使用lambda
和DataFrame.append
在“ DataFrame.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
使用带有过滤的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
另一种解决方案:
m = df['value'] < threshold
df1 = df[~m].append(df.loc[m, ['value']].sum().rename('Z'))
print (df1)
value
lab
A 50
B 35
C 8
Z 7
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.