Рассчитать количество километров, пройденных каждым человеком в каждом транспортном средстве. - PullRequest
0 голосов
/ 08 октября 2019

У меня довольно большое количество значений одометра из автопарка, состоящего из примерно 40 транспортных средств, управляемых разными людьми, но в моем примере ниже, я упрощаю.

У меня все импортировано в пандыи рядом с моими значениями одометра, у меня был водитель, который вел машину, когда происходило событие регистрации одометра (обычно они срабатывают на каждом километре, но иногда они срабатывают больше, иногда срабатывают меньше)

теперь мне нужночтобы выяснить, сколько километров транспортное средство X проехало, когда за рулем находился человек Y, но я не знаю, как.


matrix = [(1, '501', "Me"),
         (1, '502', "Me"),
         (1, '502', "Wife"),
         (1, '503', "Wife"),
         (1, '504', "Wife"),
         (1, '505', "Wife"),
         (1, '506', "Wife"),
         (1, '507', "Wife"),
         (1, '508', "Wife"),
         (1, '509', "Me"),
         (1, '510', "Me"),
         (1, '511', "Me"),
         (1, '512', "Me"),
         (1, '520', "Wife"),
         (1, '522', "Me"),
         (1, '523', "Me"),
         (1, '524', "Me"),
         (1, '524', "Me"),
         (1, '524', "Me"),
         (1, '524', "Me"),
         (1, '525', "Me"),
         (2, '126', "Me"),
         (2, '127', "Me"),
         (2, '128', "Me"),
         (2, '129', "Me"),
         ]

# Create a DataFrame object
dfObj = pd.DataFrame(matrix, columns=['Vehicle', 'ODOmeter', 'Who'])

print (dfObj)

print ("\nVehicle 1 have driven 10 km with Me behind the wheel\nand 14 km with Wife behind the wheel\nVehicle 2 have driven 3 km with me behind the wheel")

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

Копирование и вставка ответа

Вот функция для вычисления и печати желаемого результата:

def print_kilometers(dfObj):
    dfObj['ODOmeter'] = dfObj['ODOmeter'].astype(float)
    dfObj["diff"]= dfObj.groupby("Vehicle")["ODOmeter"].diff()
    sum_km = dfObj.groupby(["Who", "Vehicle"])["diff"].sum()

    for i, v in sum_km.items():
       print("Vehicle {} have driven {} km with {} behind the wheel".format(i[1], v, i[0]))

Объяснение

Если я хорошо понимаю вашу проблему, вы можете просто рассчитатьразница между километрами транспортного средства и использованием функции groupby, предоставляемой pandas. Используя в качестве примера ваш фрейм данных, вы можете сделать что-то вроде:

dfObj['ODOmeter'] = dfObj['ODOmeter'].astype(float)
dfObj["diff"]= dfObj.groupby("Vehicle")["ODOmeter"].diff()
sum_km = dfObj.groupby(["Who", "Vehicle"])["diff"].sum()

В первой строке я конвертирую столбец ODOmeter в float (если километры могут быть только целочисленными значениями, вы можете переключиться на int), вво-вторых, я добавил в dataframe столбец с diff и в последней строке я сгруппировал по Who и Vehicle и суммировал по diff столбцам. Вы можете зациклить и распечатать результаты:

for i, v in sum_km.items():
    print("Vehicle {} have driven {} km with {} behind the wheel".format(i[1], v, i[0]))
0 голосов
/ 08 октября 2019

Сначала вам нужно привести одометр к нужному типу:

dfObj['ODOmeter'] = dfObj['ODOmeter'].astype(int)

Затем вы вычисляете разницу между двумя точками данных одометра для каждого транспортного средства, давая вам счетчик на трипсете

dfObj['Tripmeter'] = dfObj.groupby('Vehicle')['ODOmeter'].diff()

А затем просто сложите Tripmeter для каждого транспортного средства и человека

dfObj.groupby(['Vehicle', 'Who'])["Tripmeter"].sum()
# Vehicle  Who 
# 1        Me      10.0
#          Wife    14.0
# 2        Me       3.0
# Name: ODOmeter, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...