“ValueError异常:值的长度不符合指标的长度”试图修改列值时,一个大熊猫GROUPBY
我有一个数据帧:“ValueError异常:值的长度不符合指标的长度”试图修改列值时,一个大熊猫GROUPBY
A C D
0 one 0.410599 -0.205158
1 one 0.144044 0.313068
2 one 0.333674 -0.742165
3 three 0.761038 -2.552990
4 three 1.494079 2.269755
5 two 1.454274 -0.854096
6 two 0.121675 0.653619
7 two 0.443863 0.864436
让我们假设A
是锚柱。我现在要显示的每个组值只有一次,在顶部:
A C D
0 one 0.410599 -0.205158
1 0.144044 0.313068
2 0.333674 -0.742165
3 three 0.761038 -2.552990
4 1.494079 2.269755
5 two 1.454274 -0.854096
6 0.121675 0.653619
7 0.443863 0.864436
这就是我想出:
df['A'] = df.groupby('A', as_index=False)['A']\
.apply(lambda x: x.str.replace('.*', '').set_value(0, x.values[0])).values
我的策略是做一个GROUPBY然后将所有值设置为除第一个以外的空字符串。这似乎不起作用,因为我得到:
ValueError: Length of values does not match length of index
这意味着我得到的输出不正确。任何想法/建议/改进欢迎。
我应该补充一点,我想概括一个解决方案,它可以在每个组的顶部或底部或中间选出值,所以我会给予更多的优先选择,帮助我做到这一点的解决方案(了解,上面的示例显示了如何仅在每个组的顶部单列出值,但是,我想概括一个解决方案,该解决方案允许我将它们排列在底部或中间)。
你的方法,因为该指数的错误没有工作。当您将'A'分组时,索引在分组数据中的表示方式也是相同的。由于set_value(0)
找不到正确的索引,因此会使用该索引创建一个新对象。这就是长度不匹配的原因。
修复1reset_index(drop=True)
df['A'] = df.groupby('A')['A'].apply(lambda x: x.str.replace('.*', '')\
.reset_index(drop=True).set_value(0, x.values[0])).values
df
A C D
0 one 0.410599 -0.205158
1 0.144044 0.313068
2 0.333674 -0.742165
3 three 0.761038 -2.552990
4 1.494079 2.269755
5 two 1.454274 -0.854096
6 0.121675 0.653619
7 0.443863 0.864436
修复2set_value
set_value
有一个名为takeable
的第三个参数,它决定了如何处理索引。默认为False
,但将其设置为True
适用于我的情况。
除了Zero's solutions,在他们的团体为中心隔离值的解决办法如下:
df.A = df.groupby('A'['A'].apply(lambda x: x.str.replace('.*', '')\
.set_value(len(x) // 2, x.values[0], True)).values
df
A C D
0 0.410599 -0.205158
1 one 0.144044 0.313068
2 0.333674 -0.742165
3 0.761038 -2.552990
4 three 1.494079 2.269755
5 1.454274 -0.854096
6 two 0.121675 0.653619
7 0.443863 0.864436
我只删除了我的,我无法删除他人的。 –
其他人可能会将他们标记为不需要/不必要,因此版主会将其删除。 –
由于值已排序,所以对第一个和最后一个个案使用duplicated
方法。
请首先
In [4233]: df.loc[df.A.duplicated(keep='first'), 'A'] = ''
In [4234]: df
Out[4234]:
A C D
0 one 0.410599 -0.205158
1 0.144044 0.313068
2 0.333674 -0.742165
3 three 0.761038 -2.552990
4 1.494079 2.269755
5 two 1.454274 -0.854096
6 0.121675 0.653619
7 0.443863 0.864436
保持最后
In [4236]: df.loc[df.A.duplicated(keep='last'), 'A'] = ''
In [4237]: df
Out[4237]:
A C D
0 0.410599 -0.205158
1 0.144044 0.313068
2 one 0.333674 -0.742165
3 0.761038 -2.552990
4 three 1.494079 2.269755
5 1.454274 -0.854096
6 0.121675 0.653619
7 two 0.443863 0.864436
实际上,因为数据在这里排序,你可以使用'df.loc [df.A == df.A.shift(),'A'] ='''? – Zero
@零你可以假设它是为这种情况排序的。然而,我试图推广一个解决方案,可以在每个组的中间或顶部或底部挑出一个值。对于这个问题,我刚刚问过如何在每个组的顶部单独列出。如果我自己弄不明白,我会就此提出一个单独的问题。 –
当你甚至有元素时,你会如何处理中间情况? – Zero