[英]Appending data into pandas dataframe
我正在構建一個系統,其中raspberry pi通過藍牙接收數據並將其解析為pandas數據幀以進行進一步處理。 但是,有一些問題。 藍牙數據包被轉換為pandas Series對象,我嘗試將其成功附加到空數據框中。 為了從藍牙數據包中提取遙測,執行以下拆分。
代碼使用正確的列名創建了一個合適的數據框,但是當我追加到其中時,Series對象的行號變成了新列。 每個附加的系列在最終數據框中都是一行。 我想知道的是:如何將Series對象添加到數據框中,以便將值放入索引從0到6而不是7到14的列中?
編輯:添加了一個屏幕截圖 ,其頂部輸出,下面是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()
追溯(最近一次通話最近):main()中的文件“ blescanner.py”,第48行,main scan.run()中的文件“ blescanner.py”,第45行
在運行pkt = pd.Series(packet.split(“,”),dtype ='str',index = self.columns)的文件“ blescanner.py”的第24行
init .format(val = len(data),ind = len(index))中的文件“ /mypythonpath/site-packages/pandas/core/series.py”,第262行
ValueError:傳遞的值的長度為1,索引暗含7
您不想以這種方式附加到DataFrame。 您可以做的是創建一系列列表,並將它們串聯在一起。
因此,如下所示:
series_list = []
for packet in p_rows:
pkt = pd.Series(packet.split(","),dtype='str')
print(pkt)
series_list.append(pkt)
p_data = pd.DataFrame(pd.concat(series_list), columns=self.columns, dtype='str')
只要您在pd.concat
調用中未指定ignore_index=True
,索引就不會重置(默認值為ignore_index=False
)。
編輯:
從您的問題尚不清楚,但是,如果您要嘗試將系列添加為新列(而不是彼此疊加),則將最后一行從上方更改為:
p_data = pd.concat(series_list, axis=1)
p_data.columns = self.columns
EDIT2:
仍不完全清楚,但聽起來(從您的編輯中)您想將系列轉置為行,其中系列的索引成為您的列。 即:
series_list = []
for packet in p_rows:
pkt = pd.Series(packet.split(","), dtype='str', index=self.columns)
series_list.append(pkt)
p_data = pd.DataFrame(pd.concat(series_list, axis=1)).T
編輯3:分割時,基於輸出圖片;
列表中的最后一個元素為空。 例如:
output = """f1:07:ad:6b:97:c8,-24,2800,23.00,17962365,25509655,None;
f1:07:ad:6b:97:c8,-24,2800,23.00,17962365,25509655,None;"""
output.split(';')
['f1:07:ad:6b:97:c8,-24,2800,23.00,17962365,25509655,None',
'\n f1:07:ad:6b:97:c8,-24,2800,23.00,17962365,25509655,None',
'']
因此,而不是for packet in p_rows
for packet in p_rows[:-1]
完整示例:
columns = ['mac', 'rssi', 'voltage', 'temperature', 'ad count', 't since boot', 'other']
output = """f1:07:ad:6b:97:c8,-24,2800,23.00,17962365,25509655,None;
f1:07:ad:6b:97:c8,-24,2800,23.00,17962365,25509655,None;"""
p_rows = output.split(";")
series_list = []
for packet in p_rows[:-1]:
pkt = pd.Series(packet.strip().split(","), dtype='str', index=columns)
series_list.append(pkt)
p_data = pd.DataFrame(pd.concat(series_list, axis=1)).T
產生
mac rssi voltage temperature ad count t since boot other
0 f1:07:ad:6b:97:c8 -24 2800 23.00 17962365 25509655 None
1 f1:07:ad:6b:97:c8 -24 2800 23.00 17962365 25509655 None
這是因為append語句中的p_data
df和pkt
數據之間的鍵沖突-您需要確保pkt
中的鍵與要附加到p_data
數據pkt
的列標題匹配。
通過將p_data
數據框中的列重命名為您在pkt
中看到的數字,或在添加數據之前重命名pkt
的鍵來解決此問題。
編輯:經過進一步討論,由於輸入數據與現有df的順序相同,因此不會將約定的列名加入其中。 只需將pd.DataFrame()
包裹在pkt
對象周圍,並確保在追加時數據行的形狀正確,即可獲得所需的結果。
import pandas as pd
import numpy as np
# Set initial df with data
d = pd.DataFrame(['f1:07:ad:6b:97:c8', '-23', '2900', '24.00', '17962371', '25509685', 'None']).T
p_data = pd.DataFrame(data=d, dtype='str')
# Parse new incoming data
output = "f1:07:ad:6b:97:c8;-24;2800;23.00;17962365;25509655;None"
pkt = output.split(";")
# Append new data to existing dataframe
p_data = p_data.append(pd.DataFrame(data=p_rows).T, ignore_index=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.