"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
我有一个数据框:
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