2017-09-27 66 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 
相關問題