добавить данные в экземпляр DataFrame, помещенный в словарь - PullRequest
2 голосов
/ 15 октября 2019

В моей задаче я пытаюсь определить DataFrame ( ex ) и сохранить в нем некоторые значения во время моих вычислений.

Ниже приведен краткий пример моей проблемы:

import pandas as pd

def main():
    ex1 = pd.DataFrame(columns=['Timestamp','A'])
    ex2 = pd.DataFrame(columns=['Timestamp','A'])
    str1 = 'hello-1'
    str2 = 'hello-2'
    tcp_hash = { 1 : (ex1, str1), 2 : (ex2, str2) }

    for idx in range(5):
        try:
            (df, str_idx) = tcp_hash.get(idx, None)
            df.append({'Timestamp': idx, 'A': str_idx}, ignore_index=True)
            tcp_hash[idx] = (df, str_idx)
        except TypeError:
            print('TCP Message: {} does not have a parser'.format(idx))

    print(ex1)
    print(ex2)

if __name__== "__main__":
    main()

В результате моих ex я получаю:

TCP Message: 0 does not have a parser
TCP Message: 3 does not have a parser
TCP Message: 4 does not have a parser
Empty DataFrame
Columns: [Timestamp, A]
Index: []
Empty DataFrame
Columns: [Timestamp, A]
Index: []

вместо:

         Timestamp     A
      0  1             hello-1

и

         Timestamp     A
      0  2             hello-2

Если я правильно понимаю мою проблему, то я предполагаю, что ex внутри _tcp_hash_ является копией моего ex вместо "ссылки".

Как могЯ исправляю свой код?

1 Ответ

2 голосов
/ 15 октября 2019

Я просто исправляю твой код. Панды df.append создадут новый объект. Таким образом, любой результат кадра данных append больше не является исходным ex1, ex2. Вы можете использовать loc для встроенного изменения ex1, ex2 следующим образом

def main():
    ex1 = pd.DataFrame(columns=['Timestamp','A'])
    ex2 = pd.DataFrame(columns=['Timestamp','A'])
    str1 = 'hello-1'
    str2 = 'hello-2'
    tcp_hash = { 1 : (ex1, str1), 2 : (ex2, str2) }

    for idx in range(5):
        try:
            (df, str_idx) = tcp_hash.get(idx, None)
            #df.append({'Timestamp': idx, 'A': str_idx}, ignore_index=True)
            df.loc[df.shape[0], :] = {'Timestamp': idx, 'A': str_idx}
            tcp_hash[idx] = (df, str_idx)
        except TypeError:
            print('TCP Message: {} does not have a parser'.format(idx))

    print(ex1)
    print(ex2)

if __name__== "__main__":
    main()    

Вывод

TCP Message: 0 does not have a parser
TCP Message: 3 does not have a parser
TCP Message: 4 does not have a parser
  Timestamp        A
0  1         hello-1
  Timestamp        A
0  2         hello-2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...