#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