#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. Вау, это действительно кажется более сложным. Я попробую это сделать. Было бы проще, если бы я перенес и выполнил вычисление строк вместо вычисления столбцов, или это было бы примерно то же самое ? Еще раз спасибо !