簡體   English   中英

將數據追加到熊貓數據框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM