У меня есть образец данных, например;
df=pd.DataFrame({'degree_awarded':['yes','no','yes','yes',
'yes','yes' ,'yes','no'],
'avg_score':[78,87,94,55,68,76,78,8]
})
степень_награда | avg_score |
---|---|
да | 78 |
нет | 87 |
да | 94 |
да | 55 |
и т. д. | и т. д. |
Я хотел бы разделить столбец «grade_awarded» на массивы «grade_awarded», «no_grade_awarded» с соответствующей оценкой, например
degree_awarded: [78, 94, 55, etc.]
no_degree_awarded: [87, etc.]
но я не уверен, как это сделать.
Любая помощь будет оценена по достоинству, спасибо за ваше время.
Да... планируете ли вы какие-либо дальнейшие операции с данными после того, как, похоже, вы можете просто после: df.groupby('degree_awarded')['avg_score'].agg(list).to_dict()
пока
Извините, ребята, примерная таблица и выходные данные должны были включать и т. д. 68,76,78,8 должны были быть включены. Еще раз извините за дополнительную путаницу. Я отредактировал исходный вопрос, надеюсь, теперь он более понятен.
listScoreAwarded=list(df[df['degree_awarded']=='yes']['avg_score'])
listScoreNotAwarded=list(df[df['degree_awarded']=='no']['avg_score'])
Оба эти списка должны работать
Вы можете использовать assign
нужные вам метки, а затем использовать groupby.agg(list)
.
Как серия:
(df
.assign(group=df['degree_awarded'].map({'yes': 'degree_awarded',
'no': 'no_degree_awarded'}))
.groupby('group')['avg_score'].agg(list)
)
выход:
group
degree_awarded [78, 94, 55, 68, 76, 78]
no_degree_awarded [87, 8]
Name: avg_score, dtype: object
Как словарь:
(df
.assign(group=df['degree_awarded'].map({'yes': 'degree_awarded',
'no': 'no_degree_awarded'}))
.groupby('group')['avg_score'].agg(list)
.to_dict()
)
вывод: {'degree_awarded': [78, 94, 55, 68, 76, 78], 'no_degree_awarded': [87, 8]}
Ааа ... только что заметил ... это будет отображаться в образце вывода, который предоставляет OP - похоже, что дубликаты отброшены ... Однако в их образце вывода также нет 8 ... что странно ...
@Jon Я заметил, что OP предоставил 2 образца, более длинный и короткий, но я пропустил дублированные 78 (хороший улов!). Я не знаю, что ожидается, но есть много обходных путей (агрегирование для установки, диктовка ключей, drop_duplicates перед и т. д.)
И полностью микро-оптимизация, я бы, вероятно, не назначал столбец для группировки, просто использовал значение, а затем переименовывал доступ к индексу после его агрегирования перед переходом к dict
... например: df.groupby('degree_awarded')['avg_score'].agg(list).rename(index={'yes': 'degree_awarded', 'no': 'no_degree_awarded'}).to_dict()
Извините, дубликаты не должны были быть удалены, что было небрежно с моей стороны. Большое спасибо за все ваши ответы.
какой тип вывода? Словарь? Ряд?