Как добавить данные в pandas.DataFrame без воссоздания экземпляра - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь разработать собственный метод доступа к фреймам данных для pandas и столкнулся с проблемой, которую я не знаю, как решить.

Мой метод доступа должен загружать данные из пользовательского источника, и я планировал назначить этизначения DataFrame для которого вызывается метод доступа. Но когда я присваиваю свой недавно созданный информационный фрейм экземпляру информационного фрейма, у меня ничего не происходит.

Я предполагаю, что это из-за того, что я создаю новый экземпляр информационного фрейма вместо повторного использования старого.

Есть ли какой-нибудь изящный способ сохранить экземпляр фрейма данных и загрузить туда информацию?

Вот мой код, как я сейчас к нему подхожу:

import pandas
import numpy


@pandas.api.extensions.register_dataframe_accessor("test")
class TestAccessor:
    def __init__(self, obj: pandas.DataFrame) -> None:
        self.data = obj

    def read(self) -> None:
        # Creates dataframe with three columns `X, Y, Z`
        self.data = pandas.DataFrame(numpy.random.randint(0,100,size=(100, 3)), columns=list('XYZ'))


# Creates dataframe with three columns `A, B, C`
data = pandas.DataFrame(numpy.random.randint(0,100,size=(100, 3)), columns=list('ABC'))

# Suppose to load dataframe with columns `X, Y, Z`
data.test.read()

# Will show dataframe with columns `A, B, C`
print (data)

Есть ли способ, как этоможет быть исправлено? Как лучше всего подойти к этой проблеме?

1 Ответ

1 голос
/ 07 октября 2019

Обратите внимание, если это действительно имеет смысл на практике, но вот решение для достижения того, что вы хотите в своем примере: отбросьте все существующие столбцы на месте и назначьте новые столбцы:

import pandas
import numpy

@pandas.api.extensions.register_dataframe_accessor("test")
class TestAccessor:
    def __init__(self, obj: pandas.DataFrame) -> None:
        self.data = obj

    def read(self) -> None:
        # Creates dataframe with three columns `X, Y, Z`
        self.data.drop(columns=self.data.columns, inplace=True)
        new = pandas.DataFrame(numpy.random.randint(0,100,size=(100, 3)), columns=list('XYZ'))
        self.data[new.columns] = new

# Creates dataframe with three columns `A, B, C`
data = pandas.DataFrame(numpy.random.randint(0,100,size=(100, 3)), columns=list('ABC'))

# Suppose to load dataframe with columns `X, Y, Z`
data.test.read()

# Now shows dataframe with columns `X, Y, Z`
print (data)

Вывод:

     X   Y   Z
0   30  86  16
1   33  93  33
2   43  62  95
3   24  74   5
4   52  68  95
..  ..  ..  ..
95  89  54  90
96  35  78  20
97  68  11  17
98  29  68  44
99  33  73  11

[100 rows x 3 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...