Панды сбрасывают строки на уровне сумм или средних по групповому уровню 2 - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу отбросить группу (все строки в группе), если сумма значений в группе равна определенному значению.

Пример приведен в следующем коде:

>>> df = pd.DataFrame(randn(10,10), index=pd.date_range('20130101',periods=10,freq='T'))
>>> df = pd.DataFrame(df.stack(), columns=['Values'])
>>> df.index.names = ['Time', 'Group']
>>> df.head(12)

                             Values
Time                Group   
2013-01-01 00:00:00   0    0.541795
                      1    0.060798
                      2    0.074224
                      3   -0.006818
                      4    1.211791
                      5   -0.066994
                      6   -1.019984
                      7   -0.558134
                      8    2.006748
                      9    2.737199
2013-01-01 00:01:00   0    1.655502
                      1    0.376214

>>> df['Values'].groupby('Group').sum()

Group
0    3.754481
1   -5.234744
2   -2.000393
3    0.991431
4    3.930547
5   -3.137915
6   -1.260719
7    0.145757
8   -1.832132
9    4.258525
Name: Values, dtype: float64

Итак, вопрос в том;например, как я могу отбросить все строки группы, где сгруппированная сумма отрицательна?В моем фактическом наборе данных я хочу отбросить группы, в которых сумма или среднее значение равно нулю.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Использование GroupBy + transform с sum с последующим логическим индексированием:

res = df[df.groupby('Group')['Values'].transform('sum') > 0]
0 голосов
/ 20 декабря 2018

С Документация панд , фильтрация кажется более подходящей:

df2 = df.groupby('Group').filter(lambda g: g['Values'].sum() >= 0)

(Старый ответ):

Это сработало для меня:

# Change the index to *just* the `Group` column
df.reset_index(inplace=True)
df.set_index('Group', inplace=True)

# Then create a filter using the groupby object
gb = df['Values'].groupby('Group')
gb_sum = gb.sum()    
val_filter = gb_sum[gb_sum >= 0].index

# Print results
print(df.loc[val_filter])

Условие, по которому вы фильтруете, может быть изменено соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...