Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将函数应用于dataframe以根据其他列/单元格扫描列/单元格中的列表_Python_List_Pandas_Dataframe_Row - Fatal编程技术网

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