Мне сложно понять, как перебирать переменные в кадре данных pandas и выполнять ту же арифметическую функцию для каждой.

У меня есть фрейм данных df, содержащий три числовые переменные x1, x2 и x3. Я хочу создать три новые переменные, умножив каждую на 2. Вот что я делаю:

existing = ['x1','x2','x3']
new = ['y1','y2','y3']

for i in existing:
    for j in new:
        df[j] = df[i]*2

Приведенный выше код фактически создает три новые переменные y1, y2 и y3 в фрейме данных. Но значения y1 и y2 замещаются значениями y3, и все три переменные имеют одинаковые значения, соответствующие значению y3. Я не уверен, что мне не хватает.

Очень признателен за любое руководство / предложение. Благодарю.

0
navi 16 Янв 2021 в 17:33

3 ответа

Лучший ответ

Здесь вы выполняете цикл примерно 9 раз - по 3 раза для каждого столбца, причем каждая итерация перезаписывает предыдущую.

Вы можете захотеть что-то вроде

for e, n in zip(existing,new):
    df[n] = df[e]*2
2
Chris 16 Янв 2021 в 14:38

Я бы сделал что-нибудь более общее

#existing = ['x1','x2','x3']
exisiting = df.columns
new = existing.replace('x','y') 
#maybe you need map+lambda/for for each existing string

for (ind_existing, ind_new) in zip(existing,new):
    df[new[ind_new]] = df[existing[ind_existing]]*2 
#maybe there is more elegant way by using pandas assign function
0
Almogx3 16 Янв 2021 в 14:40

Вы можете объединить исходный DataFrame со столбцами с двойными значениями:

cols_to_double = ['x0', 'x1', 'x2']
new_cols = list(df.columns) + [c.replace('x', 'y') for c in cols_to_double]

df = pd.concat([df, 2 * df[cols_to_double]], axis=1, copy=True)
df.columns = new_cols

Итак, если ваш входной фрейм данных df:

   x0  x1  x2  other0  other1
0   0   1   2       3       4
1   0   1   2       3       4
2   0   1   2       3       4
3   0   1   2       3       4
4   0   1   2       3       4

После выполнения предыдущих строк вы получите:

   x0  x1  x2  other0  other1  y0  y1  y2
0   0   1   2       3       4   0   2   4
1   0   1   2       3       4   0   2   4
2   0   1   2       3       4   0   2   4
3   0   1   2       3       4   0   2   4
4   0   1   2       3       4   0   2   4

Вот код для создания df:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    data=np.column_stack([np.full((5,), i) for i in range(5)]),
    columns=[f'x{i}' for i in range(3)] + [f'other{i}' for i in range(2)]
)
0
PieCot 16 Янв 2021 в 15:54
65750810