Эффективно возвращать определенные строки в pandas df

Я пытаюсь вернуть каждый элемент подряд в зависимости от места в Column D.

На данный момент делаю это через df = df.loc[df['D'] == '#specific place'].

Это нормально работает, но если у меня есть 50 разных мест, этот код становится очень неэффективным. Пришлось бы 50 раз переделывать df = df.loc[df['D'] == '#another specific place']. Я бы сделал это, если бы места остались прежними, но каждый набор данных содержал разные места.

Есть ли более эффективный способ вернуть строки для каждого места? У меня есть отдельный df с каждым местом, куда я могу вернуть list. Могу ли я использовать значения из этого списка для возврата функций в

import pandas as pd

places = ['Home','Away','Shops']

d = ({
    'C' : ['08:00:00','XX','08:10:00','XX','08:41:42','XX','08:50:00','XX', '09:00:00', 'XX','09:15:00','XX','09:21:00','XX','09:30:00','XX','09:40:00','XX'],
    'D' : ['Home','','Home','','Away','','Shops','','Away','','Shops','','Home','','Away','','Home',''],
    'E' : ['Num:','','Num:','','Num:','','Num:','','Num:', '','Num:','','Num:','','Num:', '','Num:', ''],
    'F' : ['1','','1','','1','','1','','1', '','2','','2','','1', '','2',''],   
    'A' : ['A','','A','','A','','A','','A','','A','','A','','A','','A',''],           
    'B' : ['Stop','','Res','','Stop','','Start','','Res','','Stop','','Res','','Start','','Start','']
    })

df = pd.DataFrame(data=d)

#Select desired place
Home = df.loc[df['D'] == 'Home']
Shops = df.loc[df['D'] == 'Shops']
Away = df.loc[df['D'] == 'Away']

Предполагаемый результат:

    A      B         C     D     E  F
0   A   Stop  08:00:00  Home  Num:  1
2   A    Res  08:10:00  Home  Num:  1
12  A    Res  09:21:00  Home  Num:  2
16  A  Start  09:40:00  Home  Num:  2
6   A  Start  08:50:00  Shops  Num:  1
10  A   Stop  09:15:00  Shops  Num:  2
4   A   Stop  08:41:42  Away  Num:  1
8   A    Res  09:00:00  Away  Num:  1
14  A  Start  09:30:00  Away  Num:  1
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы можете определить свои места, перебрав df ['B'] в цикле, определив непустую строку и сохранив их, например, в списке

places = []
for i in df['B']:
    if i! = "":places.append(i)
###now you can create a dict to save the differences
diff_result = {}
for i in places:
    Stop = df.loc[df['B'] == i].reset_index()['C']
    Start = df.loc[df['B'] == i].reset_index()['C']
    Res = df.loc[df['B'] == i].reset_index()['C']
    diff_result[i+"_diff"] = Res

теперь у вас есть словарь, заполненный желаемым результатом

В строке if i: = "Home":places.append(i) есть SyntaxError

user9394674 06.06.2018 01:17
Ответ принят как подходящий

Все, что вам нужно, это просто groupby (), а затем, вероятно, список исключенных / включенных уникальных элементов в столбце 'D':

df = pd.DataFrame(data=d)

df['C'] = pd.to_timedelta(df['C'], errors = "coerce").dt.total_seconds()

places = ['Home','Away','Shops']

for d, dfg in df[df['D'].isin(places)].groupby('D'):
    # print out the processing place
    print('group:{}\n{}'.format(d, dfg))
    # do whatever you want on `dfg` and `d`
    # In your example, when d is 'Home', dfg is df.loc[df['D'] == 'Home']
    # below your code, just change `df` to `dfg`
    #Return start-stop times
    Stop = dfg.loc[df['B'] == 'Stop'].reset_index()['C']
    Start = dfg.loc[df['B'] == 'Start'].reset_index()['C']
    Res = dfg.loc[df['B'] == 'Res'].reset_index()['C']

    #return difference
    Start_diff = Start - Stop
    Res_diff = Res - Start

Спасибо @jxc. Как это работает, извините? Это excluded = ['Everything I want', 'Unwanted'].

user9394674 06.06.2018 01:14

Привет, @ PeterJames123: excluded - это список уникальных значений из столбца D, которые вы не хотите включать в свою процедуру обработки (например, когда D ПУСТО). df[ ~df.D.isin(excluded) ] отфильтрует эти строки. С другой стороны, вы также можете явно указать все 50 мест, например included = ['Home', 'Away', 'Everything I want' ......], а затем использовать: df[df.D.isin(included)].groupby('D'): (удалить ~, который является побитовым инвертированием)

jxc 06.06.2018 01:42

Я упростил вопрос @jxc. Ваше решение не вернуло каждое место. Если бы у меня был пустой список, он вернул бы только одно место. Не все

user9394674 06.06.2018 02:01

Хорошо, я только что скорректировал код, чтобы он включал список только что добавленных вами мест. (Линия print() предназначена только для отладки). Однако, если в столбце D («Магазины») нет записи для place, она не будет отображаться в результате.

jxc 06.06.2018 02:17

Спасибо @jxc. Если бы я хотел использовать этот df для будущей работы, какой выходной код я бы использовал?

user9394674 06.06.2018 02:29

Привет, @ PeterJames123. Если я правильно вас понял, вы должны использовать dfg в своем обычном коде, который будет указывать на конкретный place.

jxc 06.06.2018 03:12

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