【问题标题】:Python retrieve row index of a DataframePython检索数据框的行索引
【发布时间】:2019-04-08 13:49:57
【问题描述】:

请问如何在 DataFrame 中检索行的索引? 具体来说,我可以从 df.loc 中检索行的索引。

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

我什至可以像这样使用 data.index 从 df.loc 检索行索引:

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)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用 Pandas,您可以像这样遍历数据框:

    for index in range(len(df)): 
        if df.loc[index,'year'] == "2001":
            df.loc[index,'Gender'] = df.loc[index-1 ,'Gender']
    

    【讨论】:

    • 我实际上写了一个使用 iterrows() 而不是retrieve_data(row) 的retrieve_data(df),它确实有效。但我只是好奇以防万一。因此,df.apply 无法对每个单独的行执行此操作,不是吗?
    【解决方案2】:

    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.wherepd.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())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2016-12-23
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 2014-03-08
      • 2020-10-22
      相关资源
      最近更新 更多