"ValueError: Length of values does not match length of index" when trying to modify column values a pandas groupby

"ValueError: Length of values does not match length of index" when trying to modify column values a pandas 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

我的策略是进行分组,然后将所有值设置为一个空字符串,而不是第一个。这似乎不起作用,因为我得到:

ValueError: Length of values does not match length of index

这意味着我得到的输出不正确。任何 ideas/suggestions/improvements 欢迎。

我应该补充一点,我正在尝试概括一个解决方案,该解决方案可以在每个组的顶部或底部或中间挑出值,所以我更倾向于帮助我做到这一点的解决方案(理解,上面的示例显示了如何仅在每个组的顶部挑选出值 ,但是,我想概括一个允许我在底部或中间挑选出它们的解决方案).

由于值是排序的,所以对第一种和最后一种情况使用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

由于索引错误,您的方法无效。当您按 '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 对我的情况有效。

除了之外,在他们组的中心隔离值的解决方法如下:

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