2017-09-03 1 views
1

Der Abschnitt meines Codes, die mir Probleme verursacht istTypeerror: unhashable Typ: ‚Int64Index‘

def Half_Increase(self): 
    self.keg_count=summer17.iloc[self.result_rows,2].values[0] 
    self.keg_count +=1 
    summer17[self.result_rows,2] = self.keg_count 
    print(keg_count) 

Also diese Funktion ausgeführt werden soll, wenn ein Knopf-Widget gedrückt wird. Es soll den Wert einer bestimmten Zelle in einem Datenframe erhalten, 1 dazu addieren und dann den neuen Wert an den Datenrahmen zurückgeben. (Ich bin nicht ganz sicher, ob dies der richtige Weg ist, dies zu tun.)

bekomme ich folgende Fehler

Exception in Tkinter callback 
Traceback (most recent call last): 

    File "C:\Python3.6\lib\tkinter\__init__.py", line 1699, in __call__ 
    return self.func(*args) 
    File "beerfest_program_v0.3.py", line 152, in Half_Increase 
    summer17[self.result_rows,2] = self.keg_count 
    File "C:\Python3.6\lib\site-packages\pandas\core\frame.py", line 2331, in __setitem__ 
    self._set_item(key, value) 
    File "C:\Python3.6\lib\site-packages\pandas\core\frame.py", line 2397, in _set_item 
    value = self._sanitize_column(key, value) 
    File "C:\Python3.6\lib\site-packages\pandas\core\frame.py", line 2596, in _sanitize_column 
    if broadcast and key in self.columns and value.ndim == 1: 
    File "C:\Python3.6\lib\site-packages\pandas\core\indexes\base.py", line 1640, in __contains__ 
    hash(key) 
    File "C:\Python3.6\lib\site-packages\pandas\core\indexes\base.py", line 1667, in __hash__ 
    raise TypeError("unhashable type: %r" % type(self).__name__) 
TypeError: unhashable type: 'Int64Index' 

Ich vermute, dies etwas mit den Variablen-Typen zu tun hat, nicht passend, aber Ich habe gesucht und kann nicht finden, wie man das behebt.

Antwort

1

Ich glaube, Sie brauchen iloc:

summer17.iloc[result_rows,2] += 1 

Probe:

summer17 = pd.DataFrame({'a':[1,2,3], 
         'b':[3,4,5], 
         'c':[5,9,7]}) 
#if reselt_rows is scalar 
result_rows = 1 

print(summer17) 
    a b c 
0 1 3 5 
1 2 4 9 
2 3 5 7 

summer17.iloc[result_rows,2] += 1 
print(summer17) 
    a b c 
0 1 3 5 
1 2 4 10 
2 3 5 7 

Es ist die gleiche wie:

#get value 
keg_count=summer17.iloc[result_rows,2] 
#increment 
keg_count +=1 
#set value 
summer17.iloc[result_rows,2] = keg_count 
print(summer17) 
    a b c 
0 1 3 5 
1 2 4 10 
2 3 5 7 

Aber wenn result_rows ist list oder 1d array:

result_rows = [1,2] 

#get all values per positions defined in result_rows 
#filter only first value by values[0] 
keg_count=summer17.iloc[result_rows,2].values[0] 
#increment 
keg_count +=1 
#set all values of result_rows by incremented value 
summer17.iloc[result_rows,2] = keg_count 
print(summer17) 
    a b c 
0 1 3 5 
1 2 4 10 
2 3 5 10 
+1

Das ist viel einfacher als das, was ich versuchte zu tun. – jon

Verwandte Themen