панда же атрибут сравнения - PullRequest
       7

панда же атрибут сравнения

1 голос
/ 21 сентября 2019

У меня есть следующий фрейм данных:

df = pd.DataFrame([{'name': 'a', 'label': 'false', 'score': 10},
                       {'name': 'a', 'label': 'true', 'score': 8},
                       {'name': 'c', 'label': 'false', 'score': 10},
                       {'name': 'c', 'label': 'true', 'score': 4},
                       {'name': 'd', 'label': 'false', 'score': 10},
                       {'name': 'd', 'label': 'true', 'score': 6},
                       ])

Я хочу вернуть имена, у которых значение метки «false» выше значения метки «true», по крайней мере, в два раза.В моем примере он должен возвращать только имя "c".

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Сначала вы можете повернуть данные и посмотреть соотношение, отфильтровать, что вы хотите:

new_df = df.pivot(index='name',columns='label', values='score')
new_df[new_df['false'].div(new_df['true']).gt(2)]

output:

label  false  true
name              
c         10     4

Если вы хотите только метку, вы можетеdo:

new_df.index[new_df['false'].div(new_df['true']).gt(2)].values

, что дает

array(['c'], dtype=object)

Обновление: Поскольку ваши данные являются результатом orig_df.groupby().count(), вы можете вместо этого сделать:

orig_df['label'].eq('true').groupby('name').mean()

и посмотрите на строки со значениями <= 1/3.

0 голосов
/ 21 сентября 2019

Вы можете использовать Groupby.Series.first и Groupby.Series.last , потому что, поскольку есть только два возможных варианта: true или false, поэтому всегда false будет соответствоватьfirst: `

#df=df.sort_values(['name','label'])
g=df.groupby('name')['score']
df.loc[df['label'].eq('false')].set_index('name').loc[g.first()>2*g.last()]

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