получение метки строки и столбца конкретной точки данных в dataframe

#python #python-3.x #pandas

#python #python-3.x #pandas

Вопрос:

Я пытаюсь получить метку строки и столбца столбца и строки, которые сходятся в max_val. По сути, я измеряю скорость роста от одной записи столбца к другой.

 def find_max(area):
    # YOUR CODE HERE
    data=pd.read_csv('Canada.csv')
    df = pd.DataFrame(data)

    #case insensitive
    prov_lower = province.lower()
    data['province'] = df['province'].astype(str).str.lower()

    #get percent change
    if prov_lower in data['province'].values:
        data=data[data['province']==province]
        df_match_pct=data[data.columns[3:-1]].diff(axis='columns').abs()

        #find max
        max_val=df_match_pct.max()
        max_val=max_val.max()

        #select column and row of max value
        c_r = df_match_pct.iloc[0:9] == max_val and df_match_pct[df_match_pct.iloc[0:9] == max_val]
        #how to get the column and row label of this?

    else:
        raise ValueError()

    return max_val,c_r



find_max('alberta')
 

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

Комментарии:

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

Ответ №1:

IIUC, вы могли бы использовать numpy.argwhere :

 c_r = [(c, r) for r, c in  np.argwhere(df_match_pct.values == max_val)][0]
 

Или, если вам нужны фактические метки индексов и столбцов, используйте:

 c_r = [(df_match_pct.index[c], df_match_pct.columns[r]) for r, c in  np.argwhere(df_match_pct.values == max_val)][0]
 

В качестве альтернативы вы можете использовать цепочку DataFrame.eq и DataFrame.idxmax() метод:

 c_r = (df.eq(max_val).idxmax(1).idxmax(1),
       df.eq(max_val).idxmax().idxmax())