Python 将函数应用于dataframe以根据其他列/单元格扫描列/单元格中的列表
扫描Python 将函数应用于dataframe以根据其他列/单元格扫描列/单元格中的列表,python,list,pandas,dataframe,row,Python,List,Pandas,Dataframe,Row,扫描pandas数据帧中的行时遇到问题。我在数据帧中有一些固定的输入数据(列是Time、ID和frames)。现在我试着从中得到一些结果。使用每个时间戳,我得到一个或多个LIN ID,使用每个LIN ID,我得到一个LIN帧,其中包含8个数据字节作为字符串。此数据字符串表示来自某些传感器的原始值 现在我想扫描每一行,找到LIN ID及其对应的LIN帧,计算原始传感器值,并将该值作为新列存储在pandasdataframe中。我的问题是,我在每一行得到一个ID列表和一个LIN帧列表。我的问题是:如
pandas
数据帧中的行时遇到问题。我在数据帧中有一些固定的输入数据(列是Time
、ID
和frames
)。现在我试着从中得到一些结果。使用每个时间戳,我得到一个或多个LIN ID,使用每个LIN ID,我得到一个LIN帧,其中包含8个数据字节作为字符串。此数据字符串表示来自某些传感器的原始值
现在我想扫描每一行,找到LIN ID及其对应的LIN帧,计算原始传感器值,并将该值作为新列存储在pandas
dataframe中。我的问题是,我在每一行得到一个ID列表和一个LIN帧列表。我的问题是:如何从单元格中的这些列表中获得正确的值?是否可以使用apply
或有更简单的方法
我希望我对它的描述足够好,因为我是这个论坛的新手,也是一个python
初学者。有人能看一下下面的源代码并告诉我正确的方法吗
以下是预期输出的图片:
从binascii导入不精确
将numpy作为np导入
作为pd进口熊猫
导入系统
def getVal(数据,btn):
'''
首先计算浮点值LSB的2字节十六进制数据
'''
尝试:
mydata=bytearray(不精确(数据))
b=(btn-1)*2
#交换字节顺序
val=(mydata[b+1]我将演示如何将数据拆分为与按钮对应的列。我修改了输入数据,以便能够在屏幕中很好地匹配它:
import pandas as pd
names = ["B_{}".format(x) for x in range(16)]
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': [['2518', 'B31A', 'AD18'], ['07D0'], ['0BB8'], ['0FA0'], [], [], ['3318'], ['3318'], ['3318'], ['3318']]})
df_new = pd.DataFrame(df1, columns=['Time'] + names)
for index, row in df1.iterrows():
# copying whatever data you already have in the old dataframe
df_new.loc[index] = row
# for every button ID set value in corresponding column
for ID, value in zip(row['ID'], row['frames']):
df_new.loc[index, names[int(ID)]] = value
df1
df_新建(仅显示非空列)
在df_new.loc[index,names[int(ID)]=value
步骤中,您可以将getVal
应用到value
中,我相信这将产生您需要的结果。您的问题很难理解,您能改进一下吗?1)提供示例输入和期望的输出2)解释“正确的输入数据,但不起作用”和“有效,但……数据不正确”——什么是“正确”的定义?你们认为“不起作用”是什么“.没有这些,你就很难得到帮助嗨,布莱克,谢谢你的回答。1) 正确的输入数据是数据帧df1的格式。列ID的每个单元格都有没有、一个或多个元素的列表。每个元素在柱框架中都有一个对应的框架。如果运行该示例,我会得到以下错误:值错误:数组条件必须与self的形状相同。第二个dataframe在列ID的每个单元格中只有一个元素。有了这些输入数据,我几乎得到了预期的输出数据。非常感谢正确的方法。它起作用了。我将getVal应用于值4次,因为每个值有4个按钮,并更改名称的索引器。to:对于范围(4)中的i:df_new.loc[index,names[(int(ID)-11)*4+i]]=getVal(value,i+1)顺便问一下,是否有机会提高速度,因为在正常情况下,我必须扫描多达20个文件,每个文件超过800行?@Thomas做了一个小小的更改-在创建新数据帧时,我使用原始数据帧来设置索引。这样熊猫就不需要在每次迭代时扩展数据帧,这应该会加快速度。也许有更好的办法,但我想不起来。你对时间有多敏感?如果您打算每天运行一次,那么即使是5分钟的处理时间也不会太糟糕。但是如果你每分钟运行一次,那么你肯定要比这更快:设置索引就是解决方案。在迭代行之前,我插入df=pd.concat([df,pd.DataFrame(columns=names)])来创建列。因此代码运行速度足够快。这与其说是一件时间紧迫的事情,不如说是一种安慰。非常感谢你的帮助。
import pandas as pd
names = ["B_{}".format(x) for x in range(16)]
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': [['2518', 'B31A', 'AD18'], ['07D0'], ['0BB8'], ['0FA0'], [], [], ['3318'], ['3318'], ['3318'], ['3318']]})
df_new = pd.DataFrame(df1, columns=['Time'] + names)
for index, row in df1.iterrows():
# copying whatever data you already have in the old dataframe
df_new.loc[index] = row
# for every button ID set value in corresponding column
for ID, value in zip(row['ID'], row['frames']):
df_new.loc[index, names[int(ID)]] = value
ID Time frames
0 [11, 12, 14] 0.000 [2518, B31A, AD18]
1 [12] 0.007 [07D0]
2 [13] 0.014 [0BB8]
3 [14] 0.021 [0FA0]
4 [] 0.028 []
5 [] 0.035 []
6 [11] 0.042 [3318]
7 [12] 0.049 [3318]
8 [13] 0.056 [3318]
9 [14] 0.063 [3318]
Time B_11 B_12 B_14 B_13
0 0.000 2518 B31A AD18 NaN
1 0.007 NaN 07D0 NaN NaN
2 0.014 NaN NaN NaN 0BB8
3 0.021 NaN NaN 0FA0 NaN
4 0.028 NaN NaN NaN NaN
5 0.035 NaN NaN NaN NaN
6 0.042 3318 NaN NaN NaN
7 0.049 NaN 3318 NaN NaN
8 0.056 NaN NaN NaN 3318
9 0.063 NaN NaN 3318 NaN