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
'Programing' 카테고리의 다른 글
Ruby : console.log? (0) | 2020.12.12 |
---|---|
Java에서 상수를 선언하는 방법 (0) | 2020.12.12 |
문서 높이 변경 감지 (0) | 2020.12.12 |
테이블 형식없이 SQL 쿼리 결과 가져 오기 (0) | 2020.12.12 |
모든 출력을 / dev / null로 리디렉션하는 방법은 무엇입니까? (0) | 2020.12.12 |