Вложенный цикл над столбцами в питоне Dataframe - PullRequest
0 голосов
/ 27 октября 2018

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

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).

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

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Я не думаю, что вы должны зацикливаться.Просто позвольте 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 выше, но это должно проиллюстрировать принцип

0 голосов
/ 30 октября 2018
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)
0 голосов
/ 29 октября 2018

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

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)
...