【发布时间】:2019-01-14 14:51:23
【问题描述】:
我正在构建一个系统,其中树莓派通过蓝牙接收数据并将其解析为 pandas 数据帧以进行进一步处理。但是,有几个问题。蓝牙数据包被转换为熊猫系列对象,我试图将其附加到空数据帧中,但未成功。下面的拆分是为了从蓝牙数据包中提取遥测数据。
代码用正确的列名创建了一个合适的数据框,但是当我追加到它时,Series 对象的行号变成了新列。每个附加的系列都是最终数据框中的一行。我想知道的是:如何将 Series 对象添加到数据框中,以便将值放入索引从 0 到 6 而不是从 7 到 14 的列中?
编辑:添加了screenshot, 上面输出,下面是pkt的倍数。
Edit2:为每个请求添加了完整代码。添加了错误回溯。
import time
import sys
import subprocess
import pandas as pd
import numpy as np
class Scan:
def __init__(self, count, columns):
self.running = True
self.count = count
self.columns = columns
def run(self):
i_count = 0
p_data = pd.DataFrame(columns=self.columns, dtype='str')
while self.running:
output = subprocess.check_output(["commands", "to", "follow.py"]).decode('utf-8')
p_rows = output.split(";")
series_list = []
print(len(self.columns))
for packet in p_rows:
pkt = pd.Series(packet.split(","),dtype='str', index=self.columns)
pkt = pkt.replace('\n','',regex=True)
print(len(pkt))
series_list.append(pkt)
p_data = pd.DataFrame(pd.concat(series_list, axis=1)).T
print(p_data.head())
print(p_rows[0])
print(list(p_data.columns.values))
if i_count == self.count:
self.running = False
sys.exit()
else:
i_count += 1
time.sleep(10)
def main():
columns = ['mac', 'rssi', 'voltage', 'temperature', 'ad count', 't since boot', 'other']
scan = Scan(0, columns)
while True:
scan.run()
if __name__ == '__main__':
main()
Traceback(最近一次调用最后一次): 文件“blescanner.py”,第 48 行,在 主要的() 文件“blescanner.py”,第 45 行,在 main scan.run()
文件“blescanner.py”,第 24 行,运行中 pkt = pd.Series(packet.split(","),dtype='str', index=self.columns)
文件“/mypythonpath/site-packages/pandas/core/series.py”,第 262 行,在 init 中 .format(val=len(data), ind=len(index)))
ValueError: 传递值的长度为 1,索引意味着 7
【问题讨论】:
-
可能最重要的一点是
output的结构。你能告诉我们这是什么样子吗? -
请不要添加图片/链接,只添加文字。另请参阅minimal reproducible example。
-
在您的第二次编辑中,您确定您的缩进是正确的吗?如前所述,您的 while 循环将在迭代
p_rows之前运行完成。我假设for packet in p_rows应该在您的while self.running之下
标签: python pandas dataframe append