Столбец Pandas равен значению столбца минус в строке «Имя строки»

#python #python-3.x #pandas

Вопрос:

Я пытаюсь сделать то, что, как я думал, будет простым, но это определенно не для меня…

У меня есть таблица (называемая dftl), которая выглядит так:

Событие Рамка Время Фрейм_х Time_x Frame_y Время _y
Событие А 2 270 ——— ——— ——— ———
Событие В 5 420 ——— ——— ——— ———
Событие C 11 570 ——— ——— ——— ———
Событие D 15 980 ——— ——— ——— ———
Событие E 20 1120 ——— ——— ——— ———
Файл Имя Имя Имя Имя Имя Имя

Все столбцы «Кадр» заполнены номерами того же диапазона, что и первый, то же самое для столбцов «Время».

Я хочу создать: newdftl = dftl[столбцы] — dftl[столбцы][Событие C]

Таким образом, для первого столбца кадра все строки равны их значению минус значение в этом столбце в строке, соответствующей событию C (для ячейки в кадре/Событии A это 2 — 11), например:

Событие Рамка Время Фрейм_х Time_x Frame_y Время _y
Событие А -9 -300 ——— ——— ——— ———
Событие В -6 -150 ——— ——— ——— ———
Событие C 0 0 ——— ——— ——— ———
Событие D 4 410 ——— ——— ——— ———
Событие E 9 550 ——— ——— ——— ———
Файл Имя Имя Имя Имя Имя Имя

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

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

Заранее благодарю вас за всю вашу помощь !

Орохена

Комментарии:

1. Вы должны полностью удалить последнюю строку и сохранить ее в другом фрейме данных, или dict . Панды могут обрабатывать различные типы данных, но работает намного лучше, если значения в одном столбце имеют один и тот же тип данных.

Ответ №1:

вы можете попробовать что-то подобное, отбросив последнее необработанное:

 #create the dataframe
df = pd.DataFrame(None, columns= ['Event', 'Measure', 'Measure2'])
df.loc[len(df)] = ['A', 10, 5]
df.loc[len(df)] = ['B', 11, 7]
df.loc[len(df)] = ['C', 15, 8]
df.loc[len(df)] = ['D', 21, 6]
df.loc[len(df)] = ['E', 3, 4]
print(df)

#get the new dataframe
newdf = df 
newdf[['Measure', 'Measure2']] -= newdf[newdf['Event'] == 'C'][['Measure', 'Measure2']].to_numpy()[0]
newdf
 

Комментарии:

1. И тебе спасибо! Я предполагаю, что что касается ответа Андреаса, это означает 1 строку кода для каждого столбца, который у меня есть (так как я хочу выполнить одну и ту же операцию со всеми). Есть ли способ сделать это для всех столбцов только в 1 строке кода и который будет работать, если количество столбцов будет разным ?

2. Вы можете попробовать обновленную версию, которую я опубликовал

Ответ №2:

Примеры данных:

 import pandas as pd
data = {'Event': {0: 'Event A', 1: 'Event B', 2: 'Event C', 3: 'Event D', 4: 'Event E'}, 'Frame': {0: 2, 1: 5, 2: 11, 3: 15, 4: 20}, 'Time': {0: 270, 1: 420, 2: 570, 3: 980, 4: 1120}}
df = pd.DataFrame(data)
 

Код:

 df['Frame'] = df['Frame'] - df['Frame'].loc[df['Event'] == 'Event C'].iloc[0]
df['Time'] = df['Time'] - df['Time'].loc[df['Event'] == 'Event C'].iloc[0]
 

Выход:

 print(df)

     Event  Frame  Time
0  Event A     -9  -300
1  Event B     -6  -150
2  Event C      0     0
3  Event D      4   410
4  Event E      9   550
 

Согласно запросу в комментариях (примените его к нескольким столбцам):

 import numpy as np
cols = ['Frame', 'Time']
df[cols] = df[cols] - pd.DataFrame(np.repeat(df[df['Event'].eq('Event C')].values,len(df),axis=0), columns=df.columns)[cols]
 

Комментарии:

1. Спасибо! Если я правильно понял, это означает 1 строку кода для каждого столбца, который у меня есть (так как я хочу выполнить одну и ту же операцию со всеми). Есть ли способ сделать это для всех столбцов только в 1 строке кода и который будет работать, если количество столбцов будет разным ?

2. @Orohena, да, но это становится все сложнее, см. Обновленный ответ.

3. Вау, это действительно кажется более сложным. Я попробую это сделать. Было бы проще, если бы я перенес и выполнил вычисление строк вместо вычисления столбцов, или это было бы примерно то же самое ? Еще раз спасибо !