Я хочу выполнить цикл данных, проверяя, совпадает ли имя строки с именем столбца. Если они совпадают, я хочу установить значение для пересечения равным нулю. Я пробовал несколько вариантов, но никто из них не работает. Вот псевдокод, который показывает, что я хочу сделать:
for row in dataframe:
if row_name == column_name:
dataframe[rowname][columnname] = 0
Вот как выглядят данные:
NAME1 NAME2 NAME3
NAME1 1 .9 .2
NAME2 .6 1 .7
NAME3 .5 .8 1
Вы можете рассчитать пересечение вашего индекса и столбцов. Затем pd.DataFrame.loc
пересечение и используйте pd.DataFrame.loc
для установки значений.
intersection = df.index & df.columns
for item in intersection:
df.loc[item, item] = 0
print(df)
NAME1 NAME2 NAME3
NAME1 0.0 0.9 0.2
NAME2 0.6 0.0 0.7
NAME3 0.5 0.8 0.0
Более запутанный метод, чем @jpp's, вы можете stack
df, чтобы имена столбцов составляли второй уровень индекса:
In[296]:
stack = df.stack()
stack
Out[296]:
NAME1 NAME1 1.0
NAME2 0.9
NAME3 0.2
NAME2 NAME1 0.6
NAME2 1.0
NAME3 0.7
NAME3 NAME1 0.5
NAME2 0.8
NAME3 1.0
dtype: float64
Затем мы можем скрыть сложный df и установить значение 0
где значения уровня индекса совпадают:
In[297]:
stack.loc[stack.index.get_level_values(0) == stack.index.get_level_values(1)] = 0
stack
Out[297]:
NAME1 NAME1 0.0
NAME2 0.9
NAME3 0.2
NAME2 NAME1 0.6
NAME2 0.0
NAME3 0.7
NAME3 NAME1 0.5
NAME2 0.8
NAME3 0.0
dtype: float64
Затем мы вызываем unstack
чтобы вернуться к исходному df:
In[298]:
stack.unstack()
Out[298]:
NAME1 NAME2 NAME3
NAME1 0.0 0.9 0.2
NAME2 0.6 0.0 0.7
NAME3 0.5 0.8 0.0
Это приводит к увеличению производительности на маленьком df при создании временного df из вызовов stack
и unstack
но если у вас большие перекрытия значений индекса и столбца, тогда он избегает looping