2017-09-27 196 views
0

我有一个数据帧:“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 

这意味着我得到的输出不正确。任何想法/建议/改进欢迎。

我应该补充一点,我想概括一个解决方案,它可以在每个组的顶部或底部或中间选出值,所以我会给予更多的优先选择,帮助我做到这一点的解决方案(了解,上面的示例显示了如何仅在每个组的顶部单列出值,但是,我想概括一个解决方案,该解决方案允许我将它们排列在底部或中间)。

+0

实际上,因为数据在这里排序,你可以使用'df.loc [df.A == df.A.shift(),'A'] ='''? – Zero

+0

@零你可以假设它是为这种情况排序的。然而,我试图推广一个解决方案,可以在每个组的中间或顶部或底部挑出一个值。对于这个问题,我刚刚问过如何在每个组的顶部单独列出。如果我自己弄不明白,我会就此提出一个单独的问题。 –

+0

当你甚至有元素时,你会如何处理中间情况? – Zero

回答

2

你的方法,因为该指数的错误没有工作。当您将'A'分组时,索引在分组数据中的表示方式也是相同的。由于set_value(0)找不到正确的索引,因此会使用该索引创建一个新对象。这就是长度不匹配的原因。

修复1
reset_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 

修复2
set_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 
+0

我只删除了我的,我无法删除他人的。 –

+0

其他人可能会将他们标记为不需要/不必要,因此版主会将其删除。 –

1

由于值已排序,所以对第一个和最后一个个案使用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 
相关问题