Я столкнулся с проблемой при сканировании строк из фрейма данных pandas
. У меня есть некоторые входные данные во фрейме данных, которые исправлены (столбцы Time
, ID
и frames
). Сейчас я пытаюсь получить от этого некоторые результаты. С каждой отметкой времени я получаю один или несколько LIN ID, а с каждым LIN ID я получаю один кадр LIN с 8 байтами данных в виде строки. Эта строка данных представляет необработанные значения от некоторых датчиков.
Теперь я хочу отсканировать каждую строку, найти LIN ID и соответствующий ему кадр LIN, рассчитать необработанное значение датчика и сохранить это значение в кадре данных pandas
как новый столбец. Моя проблема в том, что я получаю список идентификаторов и список рамок LIN в каждой строке. Мой вопрос: как я могу получить правильные значения из этого списка в ячейке? Это возможно с apply
или есть более простой способ?
Я надеюсь, что описал это достаточно хорошо, потому что я новичок в этом форуме и начинающий python
. Может ли кто-нибудь взглянуть на следующий исходный код и показать мне правильный путь?
Вот изображение ожидаемого результата: https://imgur.com/JhLJQZW
from binascii import unhexlify
import numpy as np
import pandas as pd
import sys
def getVal(data, btn):
'''
Calculate 2-byte hex data to float value LSB first
'''
try:
mydata = bytearray(unhexlify(data))
b = (btn - 1) * 2
# swap byteorder
val = (mydata[b + 1] << 8) + mydata[b]
except:
val = np.nan
return val
if __name__ == '__main__':
# I get data in this form
# 'Time': one set of data every 7ms
# 'ID': list of LIN Ids at each timestamp
# 'frames' : list of frames at each timestamp
#=======================================================================
# This has the correct input data, but did not works
#=======================================================================
df1 = pd.DataFrame(data={'Time': [0, 0.007, 0.014, 0.021, 0.028, 0.035, 0.042, 0.049, 0.056, 0.063],
'ID': [['11', '12', '14'], ['12'], ['13'], ['14'], [], [], ['11'], ['12'], ['13'], ['14']],
'frames': [['25186617A819AB19', 'B31A031A5F1ADF1A', 'AD18D517DD150000'], ['07D06617a719ab19'], ['0BB86617a719ab19'], ['0FA06617a719ab19'], [], [], ['33186617a719ab19'], ['33186617a719ab19'], ['33186617a719ab19'], ['33186617a719ab19']]})
# build names Btn_0_raw up to Btn_15_raw as column names
names = ["Btn_{}_raw".format(x) for x in range(16)]
# LIN IDs to search for
linIDs = ['11', '12', '13', '14']
# show values to check they are correct
# print names
# print df1["Time"].head()
# print df1.iloc[:]
# print df1["frames"].head()
#
error = False
# #loop over 16 buttons
for btn in range(16):
# show that all variables are correct;
# use constant hex data for each button group of 4 button;
# values are (100,200,300,400) (0x0064,0x00c8,0x012c,0x0190)
print "{0}:{1}, ID({2}), bytePos({3}), demo value:{4}".format(btn, names[btn], linIDs[btn / 4], (btn % 4) + 1, getVal('6400C8002c019001', (btn % 4) + 1))
try:
df1[names[btn]] = df1['frames'].where(linIDs[btn / 4] in df1['ID'], np.nan).apply(lambda x: getVal(x, (btn % 4) + 1))
except ValueError as e:
print " Value error :", e
error = True
if not error:
df1.to_excel('test-1.xls')
#===========================================================================
# An example that works, but unfortunately this input data are incorrect
#===========================================================================
df2 = pd.DataFrame(data={'Time': [0, 0.007, 0.014, 0.021, 0.028, 0.035, 0.042, 0.049, 0.056, 0.063],
'ID': ['11', '12', '13', '14', np.nan, np.nan, '11', '12', '13', '14'],
'frames': ['6400C8002c019001', '6500C9002d019101', '6600CA002e019201', '6700CB002F019301', '', '', '6400C8002c019001', '6500C9002d019101', '6600CA002e019201', '6700CB002F019301']
})
error = False
# loop over 16 buttons
for btn in range(16):
# show that all variables are correct;
print "{0}:{1}, ID({2}), bytePos({3}), demo value:{4}".format(btn, names[btn], linIDs[btn / 4], (btn % 4) + 1, getVal('6400C8002c019001', (btn % 4) + 1))
try:
df2[names[btn]] = df2['frames'].where(df2['ID'] == linIDs[btn / 4] , np.nan).apply(lambda x: getVal(x, (btn % 4) + 1))
print df2[names[btn]]
except ValueError as e:
print " Value error :", e
error = True
if not error:
df2.to_excel("test-2.xls")