使用Pandas groupby.apply删除重复项时出错

时间:2019-12-07 07:30:47

标签: pandas pandas-groupby valueerror

我有一个Pandas数据框,它具有一些重复的值,而不是行。我想使用groupby.apply删除重复项。一个例子如下。

df = pd.DataFrame([['a', 1, 1], ['a', 1, 2], ['b', 1, 1]], columns=['A', 'B', 'C'])
   A  B  C
0  a  1  1
1  a  1  2
2  b  1  1

# My function
def get_uniq_t(df):
    if df.shape[0] > 1:
        df['D'] = df.C * 10 + df.B
        df = df[df.D == df.D.max()].drop(columns='D')
    return df

df = df.groupby('A').apply(get_uniq_t)

然后我得到以下值错误消息。问题似乎与创建新列D有关。如果我在函数外部创建列D,则代码似乎运行良好。有人可以帮忙解释造成值错误消息的原因吗?

ValueError: Shape of passed values is (3, 3), indices imply (2, 3)

1 个答案:

答案 0 :(得分:2)

您的代码存在问题,因为它试图修改 原始组。

另一个问题是此函数应返回单行 不是DataFrame。

将功能更改为:

def get_uniq_t(df):
    iMax = (df.C * 10 + df.B).idxmax()
    return df.loc[iMax]

然后其应用程序返回:

   A  B  C
A         
a  a  1  2
b  b  1  1

根据评论进行编辑

我认为不允许修改原始组, 因为它将间接修改原始DataFrame。

至少它会显示关于此的警告,并且被认为是不良做法。 在Web上搜索 SettingWithCopyWarning 以获得更详细的说明。

我的代码( get_uniq_t 函数)修改原始组。 它只会从当前组中返回一个行。

根据返回最大值的行选择返回的行 df.C * 10 + df.B中的。因此,当您应用此功能时,结果是 DataFrame,连续行等于此函数的结果 连续的组。

当您执行 创建一些新内容,例如作为 groupby 指令的结果 然后将其保存到到目前为止已保存源代码的相同变量下 数据框。