Ik heb twee dataframes df1
df2
met hetzelfde aantal rijen en kolommen en variabelen, en ik probeer de booleaanse variabele choice
in de twee dataframes. Gebruik vervolgens if/else
om 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_index
voor dezelfde indexwaarden en vervolgens comapare – voor het maken van nieuwe kolom is beter gebruik mask
of 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