Вложенный цикл по столбцам в питоне фрейма данных

У меня есть следующий фрейм данных

print(df1)

        Date    start          end    delta d1   x_s    y_s      z_s    x_f      y_f    z_f
0   09/01/2017  09/01/2017  06/02/2017  28  28  0.989   0.945   0.626   0.191   0.932   0.280
1   10/01/2017  09/01/2017  06/02/2017  27  28  0.989   0.945   0.626   0.191   0.932   0.280
2   11/01/2017  09/01/2017  06/02/2017  26  28  0.989   0.945   0.626   0.191   0.932   0.280
3   12/01/2017  09/01/2017  06/02/2017  25  28  0.989   0.945   0.626   0.191   0.932   0.280
4   13/01/2017  09/01/2017  06/02/2017  24  28  0.989   0.945   0.626   0.191   0.932   0.280
5   14/01/2017  09/01/2017  06/02/2017  23  28  0.989   0.945   0.626   0.191   0.932   0.280
6   15/01/2017  09/01/2017  06/02/2017  22  28  0.989   0.945   0.626   0.191   0.932   0.280
7   16/01/2017  09/01/2017  06/02/2017  21  28  0.989   0.945   0.626   0.191   0.932   0.280
8   17/01/2017  09/01/2017  06/02/2017  20  28  0.989   0.945   0.626   0.191   0.932   0.280
9   18/01/2017  09/01/2017  06/02/2017  19  28  0.989   0.945   0.626   0.191   0.932   0.280

где df1['delta'] = df1['end'] - df1['Date'] и df1['d1'] = df['end']-df1['start'] Я хотел бы создать 3 новых столбца, в которых отображаются интерполированные значения между парами (x_s, x_f), (y_s, y_f), (z_s, z_f).

Я пробовал следующий код

def mapper (name):
     return name+'_i'

ss = list(df1[['x_s', 'y_s', 'z_s']])
fs = list(df1[['x_f', 'y_f', 'z_f' ]])
df2 = pd.DataFrame

for s in ss :
    for f in fs:
         df2[s] = df1[s] + (((df1[f] - df1[s])/df1['d1'])*df1['delta'])

df_conc = pd.concat((df1, df2_new), axis=1)

однако, когда я пытаюсь запустить вложенные циклы, я получаю следующую ошибку:

TypeError: 'type' object does not support item assignment

Интересно, что я делаю не так. Буду очень признателен за любой намек или предложение. Заранее большое спасибо!

вторая попытка:

ss = ('x', 'y', 'z') 

for s in ss: 
   df1[mapper(s)] = pd.Series((df1[s+'_s'] + ((df1[s+'_f'] - df1[s+'_s'])/(df1['d1']))*df1['delta']), name=mapper(s), index=df1.index)  

но все же я не получаю 3 новых столбца, которые проходят через следующие пары (x_s, x_f), (y_s, y_f), (z_s, z_f).

Пожалуйста, дайте мне знать, если вы заметили, что я делаю неправильно, заранее большое спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
1 673
3

Ответы 3

Это должно исправить это:

for s in ss :
    for f in fs:
        df1[mapper(s)] = pd.Series(df1[s] + (((df1[f] - df1[s])/df1['d1'])*df1['delta']), name=mapper(s), index=df1.index)

Я думаю, что это то, что вы хотите, потеряете последнюю строчку concat. Pandas хочет, чтобы индекс был передан ему, когда вы добавляете новый столбец, подобный этому, см. здесь

Что-то еще, что вам может понадобиться, - это проверить .dtypes ваших столбцов и, при необходимости, использовать pd.to_datetime. Этот также может быть полезным.

Я запустил следующее:

df1.end = pd.to_datetime(df1.end)
df1.start = pd.to_datetime(df1.start)
df1.Date = pd.to_datetime(df1.Date)


df1.delta = df1.delta / pd.offsets.Second(1)
df1.d1 = df1.d1 / pd.offsets.Second(1)

код, кажется, работает нормально только для последней пары (z_s, z_f), в то время как для других столбцов цикл работает только для списка ss, а для списка альтернатив fs он выглядит застрявшим на y_f. Я не могу понять почему ..

clu 29.10.2018 16:13

Он не выдает никаких сообщений об ошибках, но когда я смотрю на результаты в новых столбцах, кажется, что формула df1[s] + (((df1[f] - df1[s])/df1['d1'])*df1['delta']) правильно проходит через x_s, y_s и z_f для s, однако вместо этого всегда используется один и тот же столбец z_f во всех трех экземплярах. цикла через x_f, y_f, z_f. Дайте мне знать, если я недостаточно ясно выразился. Спасибо!

clu 29.10.2018 16:20

Будет ли он делать то, что вы хотите, если вы замените s в последней строке на s+f? Таким образом вы получите 6 столбцов вместо 3.

cardamom 29.10.2018 16:29

Я считаю, что мне понадобится какая-то многопроцессорная обработка, которая заставит 2 цикла ss и fs работать одновременно.

clu 29.10.2018 16:37

Я не думаю, что вам следует зацикливаться. Просто позвольте numpy делать все это за вас в векторизованном виде.

ss = df[['x_s', 'y_s', 'z_s']].values
fs = df[['x_f', 'y_f', 'z_f' ]].values
ss2 = ss + ((ss - fs)/df[['d1']].values)*df[['delta']].values

Примечание. Я уверен, что вы можете избавиться от некоторых из приведенных выше .values, но это должно проиллюстрировать принцип

Привет, Дэн, я получаю следующую ошибку главный: 1: RuntimeWarning: деление на ноль встречается в true_divide. Однако в наборе данных нет деления на ноль. что-то еще я должен проверить? Благодарность!

clu 29.10.2018 16:31
def mapper (name):
     return name+'_i'

ss = ('x', 'y', 'z') 

for s in ss: 
   df1[mapper(s)] = pd.Series((df1[s+'_s'] + ((df1[s+'_f'] - df1[s+'_s'])/(df1['d1']))*df1['delta']), name=mapper(s), index=df1.index)

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

Neuron 30.10.2018 12:05

Другие вопросы по теме