Получить список имен столбцов, которые являются (объединенными) наивысшими по подмножеству данных - PullRequest
0 голосов
/ 17 июня 2020

У меня есть DataFrame, из которого я хотел бы получить список всех имен столбцов, которые являются совокупными наивысшими по подмножеству данных. Я попробовал ответить на следующий вопрос , но получаю сообщение об ошибке. Я думаю, что это связано с добавленным столбцом «Победитель».

#!/usr/bin/env python3

import pandas as pd

raw_data = {'selection': ['A', 'B', 'C', 'D'],
        'book_1': [4.0, 5.0, 6.0, 7.0],
        'book_2': [4.0, 5.2, 6.2, 7.3],
        'book_3': [3.9, 5.2, 6.4, 6.8]}

df = pd.DataFrame(raw_data, columns = ['selection', 'book_1', 'book_2', 'book_3'])
data_fields = ['book_1', 'book_2', 'book_3']
a = df[data_fields]
dftmp = a.eq(a.max(axis=1), axis=0)
print(dftmp)
df['winner'] = dftmp.mul(dftmp.columns.to_series()).apply(','.join, axis=1).str.strip(',')

print(df)

Это дает мне результат, который я ожидаю в терминах таблицы, и показывает «Истина» для столбцов, которые имеют ( Joint) наивысшее значение из данных, но теперь как я могу получить список этих столбцов в их собственный столбец в моем исходном фрейме данных?

Извините, если это неясно или требуется дополнительная информация, я будьте счастливы go более подробно / объясните больше, если необходимо. Спасибо!

   book_1  book_2  book_3
0    True    True   False
1   False    True    True
2   False   False    True
3   False    True   False

Traceback (most recent call last):
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/array_ops.py", line 149, in na_arithmetic_op
    result = expressions.evaluate(op, str_rep, left, right)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/computation/expressions.py", line 208, in evaluate
    return _evaluate(op, op_str, a, b)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/computation/expressions.py", line 70, in _evaluate_standard
    return op(a, b)
numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U6'), dtype('<U6')) -> dtype('<U6')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./test.py", line 15, in <module>
    df['winner'] = dftmp.mul(dftmp.columns.to_series()).apply(','.join, axis=1).str.strip(',')
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/__init__.py", line 776, in f
    self, other, pass_op, fill_value=fill_value, axis=axis, level=level
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/__init__.py", line 620, in _combine_series_frame
    new_data = dispatch_to_series(left, right, func, axis="columns")
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/__init__.py", line 419, in dispatch_to_series
    new_data = expressions.evaluate(column_op, str_rep, left, right)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/computation/expressions.py", line 208, in evaluate
    return _evaluate(op, op_str, a, b)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/computation/expressions.py", line 70, in _evaluate_standard
    return op(a, b)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/__init__.py", line 407, in column_op
    return {i: func(a.iloc[:, i], b.iloc[i]) for i in range(len(a.columns))}
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/__init__.py", line 407, in <dictcomp>
    return {i: func(a.iloc[:, i], b.iloc[i]) for i in range(len(a.columns))}
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/common.py", line 64, in new_method
    return method(self, other)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/__init__.py", line 503, in wrapper
    result = arithmetic_op(lvalues, rvalues, op, str_rep)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/array_ops.py", line 197, in arithmetic_op
    res_values = na_arithmetic_op(lvalues, rvalues, op, str_rep)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/array_ops.py", line 151, in na_arithmetic_op
    result = masked_arith_op(left, right, op)
  File "/home/oddschecker-juice-finder/.venv/lib/python3.6/site-packages/pandas/core/ops/array_ops.py", line 112, in masked_arith_op
    result[mask] = op(xrav[mask], y)
numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U6'), dtype('<U6')) -> dtype('<U6')

Желаемый результат ...

    book_1  book_2 book_3 winner
0   True    True   False  book_1, book_2
1   False    True    True book_2, book_3
2   False   False    True book_3
3   False    True   False book_2

1 Ответ

0 голосов
/ 18 июня 2020

Попробуйте вместо этого ...

dftmp['winner'] = dftmp.dot(dftmp.columns+', ').str.strip(', ')
dftmp

Вывод:

   book_1  book_2  book_3          winner
0    True    True   False  book_1, book_2
1   False    True    True  book_2, book_3
2   False   False    True          book_3
3   False    True   False          book_2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...