Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
695 views
in Technique[技术] by (71.8m points)

python - pandas dataframe: how to aggregate a subset of rows based on value of a column

I have a pandas dataframe structured like this:

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

This is just an example, the actual dataframe is bigger, but follows the same structure.
The sample dataframe has been created with this two lines:

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

I would like to aggregate the rows whose value is smaller that a given threshold: all these rows should be substituted by a single row whose value is the sum of the substituted rows.

For example, if I choose a threshold = 6, the expected result should be the following:

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

How can I do this?

I thought to use groupby(), but all the examples I've seen involved the use of a separate column for grouping, so I do not know how to use it in this case.
I can select the rows smaller than my threshold with loc, by doing df.loc[df['value'] < threshold] but I do not know how to sum only these rows and leave the rest of the dataframe unaltered.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use lambda and DataFrame.append to achieve this in a 'one-liner':

thresh = 6

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

Or if you prefer

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

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

[out]

     value
lab       
A       50
B       35
C        8
X        7

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...