Fout “Kan alleen identiek gelabelde Series-objecten vergelijken” en sort_index

Ik heb twee dataframes df1df2met hetzelfde aantal rijen en kolommen en variabelen, en ik probeer de booleaanse variabele choicein de twee dataframes. Gebruik vervolgens if/elseom de gegevens te manipuleren. Maar er lijkt iets mis te zijn als ik de boolean var probeer te vergelijken.

Hier zijn mijn dataframes-voorbeeld en codes:

#df1
v_100     choice #boolean
7          True
0          True
7          False
2          True
#df2
v_100     choice #boolean
1          False
2          True
74         True
6          True
def lastTwoTrials_outcome():
     df1 = df.iloc[5::6, :] #df1 and df2 are extracted from the same dataframe first
     df2 = df.iloc[4::6, :]
     if df1['choice'] != df2['choice']:  # if "choice" is different in the two dataframes
         df1['v_100'] = (df1['choice'] + df2['choice']) * 0.5

Dit is de fout:

if df1['choice'] != df2['choice']:
File "path", line 818, in wrapper
raise ValueError(msg)
ValueError: Can only compare identically-labeled Series objects

Ik heb hierdezelfde fout gevonden, en een antwoord suggereert eerst sort_index, maar ik begrijp niet echt waarom? Kan iemand meer in detail uitleggen aub (als dat de juiste oplossing is)?

Bedankt!


Antwoord 1, autoriteit 100%

Ik denk dat u reset_indexvoor dezelfde indexwaarden en vervolgens comapare – voor het maken van nieuwe kolom is beter gebruik maskof numpy.where:

Ook in plaats daarvan +Gebruik |omdat het werken met Booleans.

df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)
df1['v_100'] = df1['choice'].mask(df1['choice'] != df2['choice'],
                                  (df1['choice'] + df2['choice']) * 0.5)
df1['v_100'] = np.where(df1['choice'] != df2['choice'],
                       (df1['choice'] | df2['choice']) * 0.5,
                        df1['choice'])

Monsters:

print (df1)
   v_100  choice
5      7    True
6      0    True
7      7   False
8      2    True
print (df2)
   v_100  choice
4      1   False
5      2    True
6     74    True
7      6    True

df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)
print (df1)
   v_100  choice
0      7    True
1      0    True
2      7   False
3      2    True
print (df2)
   v_100  choice
0      1   False
1      2    True
2     74    True
3      6    True
df1['v_100'] = df1['choice'].mask(df1['choice'] != df2['choice'],
                                  (df1['choice'] | df2['choice']) * 0.5)
print (df1)
   v_100  choice
0    0.5    True
1    1.0    True
2    0.5   False
3    1.0    True

Antwoord 2, autoriteit 88%

De fout treedt op omdat je twee panda’s.Series-objecten met verschillende indices vergelijkt. Een eenvoudige oplossing zou zijn om alleen de waarden in de reeks te vergelijken. Probeer het:

if df1['choice'].values != df2['choice'].values

Other episodes