Python получить индекс строки Dataframe - PullRequest
0 голосов
/ 05 ноября 2018

Могу ли я спросить, как получить индекс строки в DataFrame? В частности, я могу получить индекс строк из df.loc.

idx = data.loc[data.name == "Smith"].index

Я даже могу получить индекс строки из df.loc, используя data.index, например:

idx = data.loc[data.index == 5].index

Однако я не могу получить индекс непосредственно из самой строки (то есть из row.index вместо df.loc []. Index). Я пытался использовать эти коды:

idx = data.iloc[5].index

Результатом этого кода являются имена столбцов.

Для обеспечения контекста мне нужно получить индекс определенной строки (вместо строк из df.loc), чтобы использовать df.apply для каждой строки. Я планирую использовать df.apply, чтобы применить код к каждой строке и скопировать данные из строки, расположенной непосредственно над ними.

def retrieve_gender (row):
    # This is a panel data, whose only data in 2000 is already keyed in. Time-invariant data in later years are the same as those in 2000.
    if row["Year"] == 2000:
        pass
    elif row["Year"] == 2001: # To avoid complexity, let's use only year 2001 as example.
        idx = row.index # This is wrong code.
        row["Gender"] = row.iloc[idx-1]["Gender"]
    return row["Gender"]


data["Gender"] = data.apply(retrieve_gender, axis=1)

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

apply дает серии, проиндексированные по меткам столбцов

Проблема с idx = data.iloc[5].index заключается в data.iloc[5] преобразовании строки в pd.Series объект , проиндексированный по меткам столбцов .

Фактически, то, что вы запрашиваете, невозможно с помощью pd.DataFrame.apply, потому что ряд, который питает вашу retrieve_gender функцию, не содержит никакого индекса индекса.

Вместо этого использовать векторизованную логику

С Pandas строчная логика неэффективна и не рекомендуется; это включает цикл уровня Python. Вместо этого используйте столбцовую логику. Делая шаг назад, кажется, вы хотите реализовать 2 правила:

  1. Если Year не 2001, оставьте Gender без изменений.
  2. Если Year - 2001, используйте Gender из предыдущего ряда.

np.where + shift

Для приведенной выше логики вы можете использовать np.where с pd.Series.shift:

data['Gender'] = np.where(data['Year'] == 2001, data['Gender'].shift(), data['Gender'])

mask + shift

В качестве альтернативы вы можете использовать mask + shift:

data['Gender'] = data['Gender'].mask(data['Year'] == 2001, data['Gender'].shift())
0 голосов
/ 05 ноября 2018

С Pandas вы можете перебирать свой фрейм данных следующим образом:

for index in range(len(df)): 
    if df.loc[index,'year'] == "2001":
        df.loc[index,'Gender'] = df.loc[index-1 ,'Gender']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...