Рішення однієї лінії або трубопроводу
Я зупинюсь на двох речах:
ОП чітко стверджує
У мене відредаговані назви стовпців зберігаються у списку, але я не знаю, як замінити імена стовпців.
Я не хочу вирішувати проблему, як замінити '$'
або зняти перший символ з кожного заголовка стовпця. ОП вже зробила цей крок. Натомість я хочу зосередитись на заміні існуючого columns
об'єкта на новий із заданим переліком імен стовпців заміни.
df.columns = new
де new
список назв нових стовпців настільки ж простий, як і виходить. Недолік цього підходу полягає в тому, що він вимагає редагування атрибуту існуючого фрейму даних, columns
і він не робиться вбудованим. Я покажу кілька способів зробити це за допомогою конвеєрного каналу без редагування існуючого фрейму даних.
Налаштування 1
Для того, щоб зосередитись на необхідності перейменовувати замінювати імена стовпців на попередньо існуючий список, я створять новий зразок даних df
з початковими іменами стовпців та непов'язаними новими іменами стовпців.
df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']
df
Jack Mahesh Xin
0 1 3 5
1 2 4 6
Рішення 1
pd.DataFrame.rename
Вже було сказано, що якби у словнику було зіставлення старих назв стовпців з новими назвами стовпців, ви могли б використовувати pd.DataFrame.rename
.
d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)
x098 y765 z432
0 1 3 5
1 2 4 6
Однак ви можете легко створити цей словник і включити його у виклик до rename
. Далі використовується користь того факту, що під час повторення df
ми повторюємо ім’я кожного стовпця.
# given just a list of new column names
df.rename(columns=dict(zip(df, new)))
x098 y765 z432
0 1 3 5
1 2 4 6
Це чудово працює, якщо назви оригінальних стовпців унікальні. Але якщо їх немає, то це руйнується.
Налаштування 2
не унікальних стовпців
df = pd.DataFrame(
[[1, 3, 5], [2, 4, 6]],
columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']
df
Mahesh Mahesh Xin
0 1 3 5
1 2 4 6
Рішення 2,
pd.concat
використовуючи keys
аргумент
По-перше, зауважте, що відбувається при спробі використання рішення 1:
df.rename(columns=dict(zip(df, new)))
y765 y765 z432
0 1 3 5
1 2 4 6
Ми не відображали new
список як назви стовпців. Ми закінчилися повторенням y765
. Натомість ми можемо використовувати keys
аргумент pd.concat
функції під час ітерації через стовпці df
.
pd.concat([c for _, c in df.items()], axis=1, keys=new)
x098 y765 z432
0 1 3 5
1 2 4 6
Рішення 3
Реконструюйте. Це слід використовувати лише у тому випадку, якщо у вас є один dtype
для всіх стовпців. В іншому випадку ви закінчите dtype
object
для всіх стовпців, і для їх перетворення потрібна ще робота зі словником.
Неодружений dtype
pd.DataFrame(df.values, df.index, new)
x098 y765 z432
0 1 3 5
1 2 4 6
Змішаний dtype
pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))
x098 y765 z432
0 1 3 5
1 2 4 6
Рішення 4
Це хитра хитрість з transpose
і set_index
. pd.DataFrame.set_index
дозволяє нам встановити індекс вбудований, але відповідного немає set_columns
. Тож ми можемо перенести, потім set_index
, і перенести назад. Однак тут застосовується однаковий по dtype
відношенню до змішаного dtype
застереження від розчину 3.
Неодружений dtype
df.T.set_index(np.asarray(new)).T
x098 y765 z432
0 1 3 5
1 2 4 6
Змішаний dtype
df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))
x098 y765 z432
0 1 3 5
1 2 4 6
Рішення 5
Використовуйте lambda
в pd.DataFrame.rename
які циклічно кожного елемента new
в цьому рішенні, ми передаємо лямбда , який приймає , x
але потім ігнорує його. Він також приймає, y
але не очікує цього. Натомість ітератор задається як значення за замовчуванням, і я можу потім використовувати його для переходу по черзі без огляду на те, яке значення x
є.
df.rename(columns=lambda x, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6
І , як показав мені на людях в sopython чаті, якщо додати *
між ними x
і y
, я можу захистити свої y
змінний. Хоча в цьому контексті я не вірю, що це потребує захисту. Ще варто згадати.
df.rename(columns=lambda x, *, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6