【问题标题】:Use DataFrame row.index as input to lambda function result使用 DataFrame row.index 作为 lambda 函数结果的输入
【发布时间】:2022-01-09 10:33:37
【问题描述】:

我有一个大数据框 df_vol。 它有大约 20 列和 500k 行。 在名为“FTID”的列中,三个值是“###”。除了这三个实例之外,“FTID”列中的每个其他值都是唯一的。 我想搜索并将“###”的每个实例更改为唯一的。 这两个选项中的任何一个都可以接受:

  1. “###1”、“###2”、“###3”或
  2. "###" + str(row_index) for each 即用行索引连接"###"

我试过的代码是:

df_vol["FTID"] = df_vol["FTID"].apply(lambda x: "###" if x == "###" else None)

我知道上面的代码实际上并没有改变任何东西,但我不知道如何让它只提取行索引或使用增量数字。我尝试了很多不同的东西,但我是菜鸟,我在黑暗中刺伤。 在我看来它应该是这样的:

df_vol["FTID"] = df_vol["FTID"].apply(lambda x: "###" + df_vol.index.astype(str) if x == "###" else None)

但我所取得的小小的成功只是为新值返回了类似的东西:

Int64Index([   423,    424,    425,    426,    427,    428,    429,    430,

现在要去收集我所有的头发,看看我能不能把它粘在头上;)

【问题讨论】:

    标签: pandas lambda duplicates rename


    【解决方案1】:

    您可以使用x.name 访问索引。我认为你需要这样的东西:

    df_vol["FTID"] = df_vol["FTID"].apply(lambda x: f"###{x.name}" if x == "###" else x)
    

    (我不明白您为什么要将值设置为 None,因为其他值是唯一的...我认为当不等于 ### 时它应该保持不变)

    编辑:applySeriesDataframes 上使用时的工作方式略有不同。

    在您的情况下,最好创建一个函数并将其应用于您的整个数据框:

    def myfunc(row):
        if row['FTID']=="###":
            row['FTID'] = f"###{row.name}"
        return row
    
    df_vol = df_vol.apply(myfunc, axis=1)
    

    【讨论】:

    • 感谢您的回复 - 当我按照您的建议尝试时出现错误:** AttributeError: 'str' object has no attribute 'name' ** 然后我将 {x.name} 更改为 { x.index} 我最终得到的结果如下所示: ** ### 的内置方法索引> ** 对此我仍然摸不着头脑。附言。我在原始帖子中使用“else None”的原因是因为我处于陡峭的学习曲线上;)
    • 我明白了。我更新了我的答案,看看吧!
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2022-01-25
    • 2021-04-19
    相关资源
    最近更新 更多