2017-02-22 89 views
7

我想获得一个新的数据集,或将当前数据集列的值更改为其唯一值。 这里是什么,我想获得一个例子:ValueError:值的长度与索引|熊猫DataFrame.unique()

A B 
----- 
0| 1 1 
1| 2 5 
2| 1 5 
3| 7 9 
4| 7 9 
5| 8 9 

Wanted Result Not Wanted Result 
     A B   A B 
    -----   ----- 
    0| 1 1   0| 1 1 
    1| 2 5   1| 2 5 
    2| 7 9   2| 
    3| 8   3| 7 9 
        4| 
        5| 8 

我并不真正关心的指标,但它似乎是这个问题。 我的代码到目前为止是非常简单的,我尝试了2种方法,1与一个新的数据帧和一个没有。

#With New DataFrame 
def UniqueResults(dataframe): 
    df = pd.DataFrame() 
    for col in dataframe: 
     S=pd.Series(dataframe[col].unique()) 
     df[col]=S.values 
    return df 

#Without new DataFrame 
def UniqueResults(dataframe): 
    for col in dataframe: 
     dataframe[col]=dataframe[col].unique() 
    return dataframe 

我有错误“值的长度与索引的长度不匹配”两次。

回答

7

的错误出现时你试图不同长度的numpy的阵列的列表分配给一个数据帧,并且可以被再现为如下:

的四行数据帧:

df = pd.DataFrame({'A': [1,2,3,4]}) 

现在尝试指派一个列表/数组两个元素的它:

df['B'] = [3,4] # or df['B'] = np.array([3,4]) 

这两个错误了:

ValueError: Length of values does not match length of index

由于数据帧有四行,但列表和数组只有两个元素。它的解决方案

工作(谨慎使用):该列表/数组转换成熊猫系列,然后当你做任务,在系列缺失索引将充满NaN的

df['B'] = pd.Series([3,4]) 

df 
# A  B 
#0 1 3.0 
#1 2 4.0 
#2 3 NaN   # NaN because the value at index 2 and 3 doesn't exist in the Series 
#3 4 NaN 

为了您的具体问题,如果你不关心索引或列之间的值的对应关系,可以为每列丢弃重复复位后指数:

df.apply(lambda col: col.drop_duplicates().reset_index(drop=True)) 

# A  B 
#0 1 1.0 
#1 2 5.0 
#2 7 9.0 
#3 8 NaN 
+0

感谢它工作正常!我没有这样想过,小问题,当我将它保存到csv时,这段代码没有生成任何NaN,但是我在某些列的顶部留空了单元格,我想是Nans,问题是:是NaN总是会在最上面? –

+0

我不这么认为。它们应该处于最底层,除非某些列的所有值都是nan。 – Psidom

+0

好吧,我要用NaN填补空白,并检查输出是否改变 –