【问题标题】:TypeError: incompatible index of inserted column with frame index when applying a custom functionTypeError:应用自定义函数时插入列的索引与框架索引不兼容
【发布时间】:2021-10-03 21:26:01
【问题描述】:

我想对数据框组应用函数并将函数输出作为新列。

这是我写的函数:

def get_centroids(sample):
    
    # Ideally, re = complex_function(sample) that returns 1d array which has the same length as sample
    # for simplicity let's use np.random.rand(len(sample))

    re = pd.DataFrame({'B': np.random.rand(len(sample))})
    print(re)
    print(re.index)  
    return re

函数打印,

   B
0  0.176083
1  0.984371

RangeIndex(start=0, stop=2, step=1)

让我们看看这个数据框。为简单起见,它只有一个组“a”。

df = pd.DataFrame({'A': 'a a'.split(),
                   'B': [1,43],
                   'C': [4,2]})

    A   B   C
0   a   1   4
1   a   43  2

print(df.index)
RangeIndex(start=0, stop=2, step=1)

当我应用如下功能时,

df['test'] = df.groupby('A')[['B']].apply(get_centroids)

尽管 df 和 re 具有相似类型的索引,但它会抛出“TypeError:插入列的索引与帧索引不兼容”。任何帮助将不胜感激。

【问题讨论】:

  • 尝试将group_keys=False 传递给groupby,请查看documentation 并通过打印groupby 结果试验group_keys 参数而不将其分配给列。
  • 感谢您的建议。我快速尝试了 group_keys=False,但它仍然给出了同样的错误。我会用它挖掘更多。
  • 我试过了,但没有给出任何错误:df["test"] = df.groupby("A", group_keys=False)[["B"]].apply(get_centroids) 上面提供的示例数据。
  • 谢谢伙计!但它仍然会引发错误...您是否运行了整个语句?与 df["test"] = 一样
  • 是的整个语句,没有错误。我使用熊猫版本 1.2.4。

标签: python pandas dataframe group-by apply


【解决方案1】:

当我在玩弄这些建议时,我意识到单独使用 df.groupby('A')[['B']].apply(get_centroids) 可以正常工作,而分配会导致错误。

换句话说,df 接收不好df.groupby('A')[['B']].apply(get_centroids)。然后我决定检查df.groupby('A')[['B']].apply(get_centroids).index 这是

MultiIndex([('a', 0),
            ('a', 1)],
           names=['A', None])

df 的索引是RangeIndex(start=0, stop=2, step=1)。因此,RangeIndexMultiIndex 不匹配导致了该问题。

这可以通过如下重置和设置df.groupby('A')[['B']].apply(get_centroids)的索引来解决。

df['test'] = df.groupby('A')[['B']].apply(get_centroids).reset_index().set_index('level_1').drop('A',axis=1)

这里提出了相同的解决方案https://stackoverflow.com/a/66709059/8561039

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2022-10-20
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多