我有一个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)
答案 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 指令的结果 然后将其保存到到目前为止已保存源代码的相同变量下 数据框。