У меня есть следующий фрейм данных
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).
Пожалуйста, дайте мне знать, если вы заметили, что я делаю неправильно, заранее большое спасибо!
Это должно исправить это:
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)
Он не выдает никаких сообщений об ошибках, но когда я смотрю на результаты в новых столбцах, кажется, что формула 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. Дайте мне знать, если я недостаточно ясно выразился. Спасибо!
Будет ли он делать то, что вы хотите, если вы замените s
в последней строке на s+f
? Таким образом вы получите 6 столбцов вместо 3.
Я считаю, что мне понадобится какая-то многопроцессорная обработка, которая заставит 2 цикла ss и fs работать одновременно.
Я не думаю, что вам следует зацикливаться. Просто позвольте 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. Однако в наборе данных нет деления на ноль. что-то еще я должен проверить? Благодарность!
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)
Спасибо за предоставленный код, который может помочь решить проблему, но в целом ответы намного полезнее, если они включают объяснение того, для чего предназначен код, и почему это решает проблему.
код, кажется, работает нормально только для последней пары (z_s, z_f), в то время как для других столбцов цикл работает только для списка ss, а для списка альтернатив fs он выглядит застрявшим на y_f. Я не могу понять почему ..