Programing

Pandas 시리즈에 단일 항목을 추가하는 방법

crosscheck 2020. 12. 12. 10:07
반응형

Pandas 시리즈에 단일 항목을 추가하는 방법


직렬화 된 팬더 시리즈에 단일 항목을 어떻게 추가합니까? 메모리 현명한 가장 효율적인 방법이 아니라는 것을 알고 있지만 여전히 그렇게해야합니다.

함께 뭔가 :

>> x = Series()
>> N = 4
>> for i in xrange(N):
>>     x.some_appending_function(i**2)    
>> print x

0 | 0
1 | 1
2 | 4
3 | 9

또한 pandas DataFrame에 단일 행을 어떻게 추가 할 수 있습니까?


단일 항목을 추가하는 방법. 이것은 그다지 효과적이지는 않지만 귀하가 요구하는 바를 따릅니다.

x = p.Series()
N = 4
for i in xrange(N):
   x = x.set_value(i, i**2)

x를 생성합니다.

0    0
1    1
2    4
3    9

단 한 번의 샷으로이 시리즈를 생성하는 더 좋은 방법이 분명히 있습니다.

두 번째 질문에 대한 답변과 SO 질문에 대한 참조 는 pandas.DataFrame에 한 행을 추가하십시오 .


TLDR : 시리즈에 항목을 하나씩 추가하지 말고 정렬 된 컬렉션으로 확장하는 것이 좋습니다.

현재 형식의 질문은 약간 까다 롭다고 생각합니다. 그리고 받아 들여진 대답은 질문에 대한 대답입니다. 그러나 팬더를 많이 사용할수록 시리즈에 항목을 하나씩 추가하는 것이 좋지 않다는 것을 더 많이 이해합니다. 팬더 초보자에게 이유를 설명해 드리겠습니다.

주어진 Series에 데이터를 추가하면 일부 리소스를 재사용 할 수 있다고 생각할 수 있지만 실제로 Series는 인덱스와 값 배열 간의 관계를 저장하는 컨테이너 일뿐입니다. 각각은 내부적으로 numpy.array이며 인덱스는 변경할 수 없습니다. 인덱스에서 누락 된 레이블이있는 항목을 Series에 추가하면 n + 1 크기의 새 인덱스가 생성되고 동일한 크기의 새 값 값 배열이 생성됩니다. 즉, 항목을 하나씩 추가 할 때 각 단계에서 n + 1 크기의 배열을 두 개 더 만듭니다.

그런데 위치별로 새 항목을 추가 할 수 없으며 (IndexError가 발생합니다) 인덱스의 레이블이 고유 할 필요는 없습니다. 즉, 레이블이있는 값을 할당 할 때 값을 모두에게 할당합니다. 레이블이있는 기존 항목 및이 경우 새 행이 추가되지 않습니다. 이것은 미묘한 버그로 이어질 수 있습니다.

이야기의 교훈은 데이터를 하나씩 추가해서는 안되며, 정렬 된 컬렉션으로 확장해야한다는 것입니다. 문제는 Series를 inplace로 확장 할 수 없다는 것입니다. 그렇기 때문에 참조로 Series의 특정 인스턴스를 업데이트 할 필요가 없도록 코드를 구성하는 것이 좋습니다.

레이블을 직접 만들고 레이블이 증가하는 경우 가장 쉬운 방법은 사전에 새 항목을 추가 한 다음 사전에서 새 Series를 만들고 (키 정렬) Series를 이전 항목에 추가하는 것입니다. 키가 증가하지 않는 경우 새 레이블과 새 값에 대해 두 개의 개별 목록을 만들어야합니다.

다음은 몇 가지 코드 샘플입니다.

In [1]: import pandas as pd
In [2]: import numpy as np

In [3]: s = pd.Series(np.arange(4)**2, index=np.arange(4))

In [4]: s
Out[4]:
0    0
1    1
2    4
3    9
dtype: int64

In [6]: id(s.index), id(s.values)
Out[6]: (4470549648, 4470593296)

기존 항목을 업데이트 할 때 인덱스와 값 배열은 동일하게 유지됩니다 (값 유형을 변경하지 않은 경우).

In [7]: s[2] = 14  

In [8]: id(s.index), id(s.values)
Out[8]: (4470549648, 4470593296)

그러나 새 항목을 추가하면 새 인덱스와 새 값 배열이 생성됩니다.

In [9]: s[4] = 16

In [10]: s
Out[10]:
0     0
1     1
2    14
3     9
4    16
dtype: int64

In [11]: id(s.index), id(s.values)
Out[11]: (4470548560, 4470595056)

즉, 여러 항목을 추가하고 사전에 수집하고 시리즈를 만들고 이전 항목에 추가하고 결과를 저장하려는 경우입니다.

In [13]: new_items = {item: item**2 for item in range(5, 7)}

In [14]: s2 = pd.Series(new_items)

In [15]: s2  # keys are guaranteed to be sorted!
Out[15]:
5    25
6    36
dtype: int64

In [16]: s = s.append(s2); s
Out[16]:
0     0
1     1
2    14
3     9
4    16
5    25
6    36
dtype: int64

인덱스와 가치가있는 경우. 그런 다음 시리즈에 다음과 같이 추가 할 수 있습니다.

obj = Series([4,7,-5,3])
obj.index=['a', 'b', 'c', 'd']

obj['e'] = 181

이렇게하면 시리즈에 새 값이 추가됩니다 (시리즈 끝).


You can use the append function to add another element to it. Only, make a series of the new element, before you append it:

test.append(pd.Series(200, index=[101]))

Adding to joquin's answer the following form might be a bit cleaner (at least nicer to read):

x = p.Series()
N = 4
for i in xrange(N):
   x[i] = i**2

which would produce the same output

also, a bit less orthodox but if you wanted to simply add a single element to the end:

x=p.Series()
value_to_append=5
x[len(x)]=value_to_append

As far as @joaqin's solution is deprecated, because set_value method will be removed in a future pandas release, I would mention the other option to add a single item to pandas series, using .at[] accessor.

In [1]: import pandas as pd
        x = pd.Series()
        N = 4
        for i in range(N):
            x.at[i] = i**2

It produces the same output.

In [2]: x
Out[2]: 0    0
        1    1
        2    4
        3    9

참고URL : https://stackoverflow.com/questions/13331518/how-to-add-a-single-item-to-a-pandas-series

반응형