Написание функции, которая возвращает и печатает максимальное значение из всех значений в столбце - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть эта таблица:

Таблица DataFrame, созданная с помощью ноутбука Jupyter.

На самом деле это только часть таблицы.

Полная таблица на самом деле представляет собой файл .csv, и с помощью функции .head () отображаются только первые пять строк.

Мне нужно написать функцию, которая возвращаети выводит максимальное значение из всех значений во втором столбце, меткой которого является «Gold».
Эта функция должна возвращать одно строковое значение.

Я посмотрел на несколькоИсточники, прежде чем писать мой вопрос, пытаются многими способами решить мою проблему.

Кажется, это очень простое решение, но, к сожалению, мне не удалось его найти.
(Возможно, есть несколько дополнительных решений для этого запроса ...?)

Пожалуйста, помогите мне, я в полном замешательстве.
Спасибо!

Вот все источники:

И вот все способы, которые я пробовалдля решения этой проблемы у некоторых были синтаксические ошибки:

1.a: традиционный алгоритм определения максимального значения, как в языке C: цикл for.

def answer_one():

row=1

max_gold = df['Gold'].row  # Setting the initial maximum.

for col in df.columns: 

    if col[:2]=='Gold': # finding the column.    

        # now iterating through all the rows, finding finally the absolute maximum:

        for row in df.itertuples():  # I also tried: for row=2 in df.rows:

            if(df['Gold'].row > max_gold)  # I also tried: if(row.Gold > max_gold)

                 max_gold = df['Gold'].row  #  I also tried: max_gold = row.Gold

return df.max_gold

У меня были проблемы с тем, как объединить функцию печати с приведенным выше кодом, поэтому я добавил ее отдельно:

1.b:

for row in df.itertuples():
    print(row.Gold)         # or: print(max_gold)

1.c:

for col in df.columns: 

if col[:2]=='Gold':

    df[df['Gold'].max()]

2.

def answer_one():

df = pd.DataFrame(columns=['Gold']) # syntax error.

for row in df.itertuples():    # The same as the separated code sction above.
        print(row.Gold)

3.

def answer_one():

print(df[['Gold']][df.Value == df.Value.max()]) # I don't know if "Value" is a key word or not.
def answer_one():
return df['Gold'].max() # right syntax, wrong result (not the max value). 

5.

def answer_one():

s=data.max()

print '%s' % (s['Gold']) # syntax error. 

6.a:

def answer_one():

df.loc[df['Gold'].idxmax()] # right syntax, wrong output (all the column indexes of the table are shown in a column)

6.b:

def answer_one():

df.loc[:,['Gold']]  # or: df.loc['Gold']  

df['Gold'].max()

Ответы [ 2 ]

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

Что ж, после проверки всех предложенных выше решений все они возвращают одно и то же значение: 976 .

Но оно не возвращает 1022 (правильный ответ)в любом случае.

Смотрите здесь:

здесь:

, а также здесь:

Последнее изображение показывает, что возвращаемое значение на самом деле уже типа 'int64' и НЕ типа 'str', проверяю ли я тип значения с помощью dtype() function до следующего фрагмента:

def answer_one():
    return df['Gold'].max()

answer_one()

или после это.

Относительно строки кода:

df.loc[:,'Gold'] = df.loc[:,'Gold'].str.replace(',','').astype(int)

, который был предложен выше и который используется для приведения типа 'str' типа значения (строки) к 'int64' тип значения (число) - он возвращает мне сообщение об ошибке, так как в любом случае это не тип 'str'.

Если кто-нибудь ответит мне, почему я не получу правильный ответ?(976 вместо 1022)
Это проблема моего ноутбука Jupyter?Может быть, что-то еще?

Спасибо!

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

Отличный первый вопрос, я предполагаю, что вы делаете курс python for datascience на coursera?

Как уже указывалось, df['Gold'].max() правильно, однако, если тип данных неверен, он не вернетожидаемый результат.Итак, во-первых, убедитесь, что это число.Вы можете проверить это, запустив df['Gold'].dtype, если для этого набора данных выходной сигнал не int64, вы, вероятно, сможете исправить его, запустив df.loc[:,'Gold'] = df.loc[:,'Gold'].str.replace(',','').astype(int), после чего df['Gold'].max() вернет 1022.

Когда дело доходит доВ этом случае вы можете выполнять итерацию по всем значениям в серии Gold вместо того, чтобы выполнять итерации по всем столбцам и всем строкам.Обратите внимание, что python использует 0 индексирования!поэтому, если бы вы использовали строку 1 в качестве начальной точки, вы бы получили неверный результат, если наибольшее значение находится в первой строке (row0), и вы индексируете, используя [Index], а не .Index.Таким образом, цикл for может выглядеть следующим образом.

CurrentMax = df['Gold'][0]
for value in df['Gold']:
    if value>CurrentMax:
        CurrentMax = value
print(CurrentMax)

Обернут как функция:

def rowbyrow(df=df):
    CurrentMax = df['Gold'][0]
    for value in df['Gold']:
        if value>CurrentMax:
            CurrentMax = value
    #print(CurrentMax) if you want to print the result when running
    return CurrentMax

Относительно пункта 3. Я полагаю, что вы ищете ниже, он фильтрует золото погде значение Gold равно максимальному значению, так как вы использовали две скобки вокруг Gold, это вернет информационный кадр, а не только значение: df[['Gold']][df.Gold == df.Gold.max()] с одной скобкой вернет серию: df['Gold'][df.Gold == df.Gold.max()]

Что касается пункта 5, синтаксическая ошибка может быть вызвана, если вы используете Python 3?В Python 3 вам нужно использовать () после оператора print, поэтому ниже должно работать:

s=df.max()
print('%s' % (s['Gold']))

Относительно пункта 6: a если вы хотите вывести только определенный столбец, вам нужно пропустить этот столбец(s) после условия фильтрации (разделенного ,), как показано ниже:

df.loc[df['Gold'].idxmax(),'Gold']

если вы хотите вернуть несколько столбцов, вы можете передать список, например

df.loc[df['Gold'].idxmax(),['Country','Gold']]

для точки 1: c, [:2] вернет первые две буквы.Поэтому всегда будет ложным при сравнении с четырехбуквенным словом Gold.

Некоторые сравнения производительности:

1.

%%timeit
df.loc[df['Gold'].idxmax(),'Gold']
10000 loops, best of 3: 76.6 µs per loop

2.

%%timeit
s=df.max()
'%s' % (s['Gold'])
1000 loops, best of 3: 733 µs per loop

3.

%%timeit
rowbyrow()
10000 loops, best of 3: 71 µs per loop

4.

%%timeit
df['Gold'].max()
10000 loops, best of 3: 106 µs per loop

Я был удивлен, увидев, что функция rowbyrow() показала самый быстрый результат,

После создания ряда со случайными значениями 10k, rowbyrow() был самым быстрым.

Смотрите здесь:

df = pd.DataFrame((np.random.rand(10000, 1)), columns=['Gold']) 

%%timeit  # no. 1
df['Gold'].max()

The slowest run took 10.30 times longer than the fastest.   
10000 loops, best of 3: 127 µs per loop


%%timeit  # no. 2
rowbyrow()

The slowest run took 8.12 times longer than the fastest.   
10000 loops, best of 3: 72.7 µs per loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...