Как заполнить категории в одном столбце и вставить точное значение в другой столбец

#python #python-3.x #pandas #dataframe

Вопрос:

Прошло много времени с тех пор, как я имел дело с библиотекой панд. Я искал его, но не смог придумать эффективного способа, который мог бы быть функцией, существующей в библиотеке.

Допустим, у меня есть фрейм данных ниже:

 df1 = pd.DataFrame({'V1':['A','A','B'],  'V2':['B','C','C'],  'Value':[4, 1, 5]}) df1  

введите описание изображения здесь

И я хотел бы расширить этот набор данных и заполнить все комбинации категорий и указать его соответствующее значение как точно такое же.

 df2 = pd.DataFrame({'V1':['A','B','A', 'C', 'B', 'C'],  'V2':['B','A','C','A','C','B'],  'Value':[4, 4 , 1, 1, 5, 5]}) df2  

введите описание изображения здесь

Другими словами, в df1 A и B имеют значение 4, и я также хочу, чтобы строка из этих B и A имела значение 4 во втором кадре данных. Это очень похоже на плавление. Я также не хочу использовать цикл for. Я ищу более эффективный способ.

Ответ №1:

Воспользуйся:

 df = pd.concat([df1, df1.rename(columns={'V2':'V1', 'V1':'V2'})]).sort_index().reset_index(drop=True)  

Выход:

 V1 V2 Value 0 A B 4 1 B A 4 2 A C 1 3 C A 1 4 B C 5 5 C B 5  

Ответ №2:

Или np.vstack :

 gt;gt;gt; pd.DataFrame(np.vstack((df1.to_numpy(), df1.iloc[:, np.r_[1:-1:-1, -1]].to_numpy())), columns=df1.columns)  V1 V2 Value 0 A B 4 1 A C 1 2 B C 5 3 B A 4 4 C A 1 5 C B 5 gt;gt;gt;   

Для правильного порядка:

 gt;gt;gt; pd.DataFrame(np.vstack((df1.to_numpy(), df1.iloc[:, np.r_[1:-1:-1, -1]].to_numpy())), columns=df1.columns, index=[*df1.index, *df1.index]).sort_index()  V1 V2 Value 0 A B 4 0 B A 4 1 A C 1 1 C A 1 2 B C 5 2 C B 5 gt;gt;gt;   

И сброс индекса:

 gt;gt;gt; pd.DataFrame(np.vstack((df1.to_numpy(), df1.iloc[:, np.r_[1:-1:-1, -1]].to_numpy())), columns=df1.columns, index=[*df1.index, *df1.index]).sort_index().reset_index(drop=True)  V1 V2 Value 0 A B 4 1 B A 4 2 A C 1 3 C A 1 4 B C 5 5 C B 5 gt;gt;gt;  

Ответ №3:

Вы можете использовать методы assign и append :

 df1.append(df1.assign(V1=df1.V2, V2=df1.V1), ignore_index=True)  

Выход:

 V1 V2 Value 0 A B 4 1 A C 1 2 B C 5 3 B A 4 4 C A 1 5 C B 5