У меня есть фрейм данных, и я хотел бы найти n самых высоких чисел в каждом столбце. Для этого существует множество способов, но все они терпят неудачу из-за того, что строки также находятся в фрейме данных. Я пробовал множество способов обойти это, но меня всегда озадачивает наличие строк.
Поскольку некоторые ячейки содержат %
, полное отсутствие всех столбцов строкового типа не сработает. Однако игнорирование ячеек, содержащих A-Z, будет работать.
Пример кадра данных:
import pandas as pd
test_data = {
'Animal': ['Otter', 'Turtle', 'Chicken'],
'Squeak Appeal': [12.8, 1.92, 11.4],
'Richochet Chance': ['8%', '30%', '16%'],
}
test_df = pd.DataFrame(
test_data,
columns=['Animal', 'Squeak Appeal','Richochet Chance']
)
я). Попытка использования apply
:
test_df.apply(
lambda x: pd.Series
(x.str.strip('%').astype(float).nlargest(2).index)
)
AttributeError: ('Can only use .str accessor with string values!', 'occurred at index Squeak Appeal')
ii). а). попробуйте использовать for-loop
:
headers = list(test_df.columns.values)
for header in headers:
if not ['a-z'] in test_df[header]:
max_value = (
test_df[header]
.str.strip('%') # remove the ending %
.astype(float) # convert to float
.nlargest(10).index # nlargest and index
)
TypeError: unhashable type: 'list'
ii). б). Я также попытался исключить «e» в качестве эксперимента, чтобы обойти if-statement
:
#...
if not 'e' in test_df[header]:
#...
AttributeError: Can only use .str accessor with string values!
III). Я попытался использовать numpy
, как я видел, использовал его в другом месте, но не очень понял идею:
import numpy as np
N = 3
a = np.argsort(-test_df.values, axis=0)[-1:-1-N:-1]
b = pd.DataFrame(df.index[a], columns=df.columns)
print (b)
TypeError: bad operand type for unary -: 'str'
Я мог бы продолжить, но мне кажется, что это будет пустой тратой места для текста. Может ли кто-нибудь указать мне в правильном направлении?
Пример результата:
print(richochet_chance_max)
Animal Squeak Appeal Richochet Chance
1 Turtle 1.92 30%
2 Chicken 11.40 16%
print(squeak_appeal_max)
Animal Squeak Appeal Richochet Chance
1 Otter 12.8 8%
2 Chicken 11.4 16%
Вы можете преобразовать строковый столбец в float
, а затем преобразовать его обратно в str
после получения n самых больших значений:
# Convert the string column to float
test_df['Richochet Chance'] = test_df['Richochet Chance'].str.strip('%').astype(float)
# Get nlargest as you want
test_df = test_df.nlargest(2, columns=['Squeak Appeal', 'Richochet Chance'])
# Convert the string column back to string
test_df['Richochet Chance'] = test_df['Richochet Chance'].map(lambda x: f'{x:.0f}%')
Вывод для nlargest = 2
:
Animal Squeak Appeal Richochet Chance
0 Otter 12.8 8%
2 Chicken 11.4 16%
Похоже, что pandas sort_values() должен делать то, что вы хотите, вы можете сортировать
by
каждый столбец и передаватьkey
, чтобы изменить способ сортировки нечисловых значений.