빈 Panda DataFrame을 만들고 이를 채우는 방법?
팬더 Data Frame 문서부터 시작하겠습니다.http://pandas.pydata.org/pandas-docs/stable/dsintro.html
Data Frame에 시계열 계산의 값을 반복적으로 채우고 싶습니다.기본적으로 열 A, B 및 타임스탬프 행(모두 0 또는 모두 NaN)을 사용하여 DataFrame을 초기화합니다.
이 .row[A][t] = row[A][t-1]+1
것 같아요.
저는 현재 아래와 같은 코드를 사용하고 있습니다만, 조금 보기 흉하고 Data Frame을 직접 사용할 수 있는 방법, 또는 일반적인 방법으로 사용할 수 있는 방법이 있을 것입니다.주의: Python 2.7을 사용하고 있습니다.
import datetime as dt
import pandas as pd
import scipy as s
if __name__ == '__main__':
base = dt.datetime.today().date()
dates = [ base - dt.timedelta(days=x) for x in range(0,10) ]
dates.sort()
valdict = {}
symbols = ['A','B', 'C']
for symb in symbols:
valdict[symb] = pd.Series( s.zeros( len(dates)), dates )
for thedate in dates:
if thedate > dates[0]:
for symb in valdict:
valdict[symb][thedate] = 1+valdict[symb][thedate - dt.timedelta(days=1)]
print valdict
Data Frame을 행 단위로 확장하지 마십시오.
TLDR; (굵은 글씨만 읽어주세요)
대부분의 답변에서는 빈 데이터 프레임을 만들고 입력하는 방법을 알려 주지만, 아무도 이것이 나쁜 짓이라고 말하지 않습니다.
제 조언은 다음과 같습니다.데이터 프레임이 아닌 목록에 데이터를 축적합니다.
목록을 사용하여 데이터를 수집한 다음 준비가 되면 Data Frame을 초기화합니다. 또는 중 pd.DataFrame
둘 다 받아들입니다.
data = []
for row in some_function_that_yields_data():
data.append(row)
df = pd.DataFrame(data)
pd.DataFrame
는 행 목록(각 행은 스칼라 값)을 데이터 프레임으로 변환합니다.함수에서 DataFrames가 출력되면 에 문의하십시오.
이 접근법의 장점:
빈 DataFrame(또는 NaN 중 하나)을 생성하여 여러 번 추가하는 것보다 목록에 추가하고 DataFrame을 한 번에 작성하는 것이 항상 저렴합니다.
리스트는 메모리 사용량도 적고 (필요한 경우) 작업, 추가 및 삭제가 훨씬 더 가벼운 데이터 구조입니다.
dtypes
(할당하지 않고) 자동으로 추론됩니다.object
( 에た )각 반복 시 추가할 행에 올바른 인덱스를 할당하는 대신 A가 데이터에 대해 자동으로 생성됩니다.
아직 납득할 수 없는 경우는, 다음의 메뉴얼에도 기재되어 있습니다.
DataFrame에 행을 반복적으로 추가하는 것은 단일 연결보다 계산 부하가 더 높을 수 있습니다.더 나은 해결책은 이러한 행을 목록에 추가한 다음 목록을 원본 DataFrame과 연결하는 것입니다.
*** 판다 업데이트 >= 1.4:append
폐지되었습니다!**
팬더 1.4를 기준으로append
가 폐지되었습니다!대신 사용하세요.릴리스 노트를 참조해 주세요.
이 옵션들은 끔찍하다.
append
또는concat
고리 안에
초보자부터 본 가장 큰 실수는 다음과 같습니다.
df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
df = df.append({'A': i, 'B': b, 'C': c}, ignore_index=True) # yuck
# or similarly,
# df = pd.concat([df, pd.Series({'A': i, 'B': b, 'C': c})], ignore_index=True)
메모리가 재할당되는 시간:append
또는concat
수술을 할 수 있습니다.이것을 루프와 결합하면 2차 복잡도 연산이 됩니다.
관련된 다른 실수는df.append
append는 인플레이스 기능이 아니기 때문에 결과를 다시 할당해야 합니다.dtype도 고려해야 합니다.
df = pd.DataFrame(columns=['A', 'B', 'C'])
df = df.append({'A': 1, 'B': 12.3, 'C': 'xyz'}, ignore_index=True)
df.dtypes
A object # yuck!
B float64
C object
dtype: object
개체 기둥을 다루는 것은 결코 좋은 일이 아닙니다. 왜냐하면 판다는 개체 기둥에 대한 작업을 벡터화할 수 없기 때문입니다.이 문제를 해결하려면 다음 절차를 수행해야 합니다.
df.infer_objects().dtypes
A int64
B float64
C object
dtype: object
loc
고리 안에
나도 본 적이 있다.loc
빈 상태로 작성된 DataFrame에 추가하는 데 사용됩니다.
df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
df.loc[len(df)] = [a, b, c]
이전과 같이 매번 필요한 메모리 양을 미리 할당하지 않았기 때문에 새 행을 생성할 때마다 메모리가 다시 늘어납니다.와 마찬가지로 나쁘다append
, 그리고 더 못생겼다.
NaN의 빈 데이터 프레임
그리고 NaNs의 Data Frame을 만들고 이와 관련된 모든 경고도 작성합니다.
df = pd.DataFrame(columns=['A', 'B', 'C'], index=range(5))
df
A B C
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
다른 열과 마찬가지로 개체 열의 DataFrame을 생성합니다.
df.dtypes
A object # you DON'T want this
B object
C object
dtype: object
추가에는 위와 같은 모든 문제가 있습니다.
for i, (a, b, c) in enumerate(some_function_that_yields_data()):
df.iloc[i] = [a, b, c]
증명은 푸딩 안에 있다
이러한 방법의 타이밍을 재는 것이, 메모리와 유틸리티의 차이가 어느 정도인지를 알 수 있는 가장 빠른 방법입니다.
다음은 몇 가지 제안 사항입니다.
색인에 사용:
import datetime
import pandas as pd
import numpy as np
todays_date = datetime.datetime.now().date()
index = pd.date_range(todays_date-datetime.timedelta(10), periods=10, freq='D')
columns = ['A','B', 'C']
주의: 빈 Data Frame을 생성할 수 있습니다.NaN
s) 단순히 작성:
df_ = pd.DataFrame(index=index, columns=columns)
df_ = df_.fillna(0) # with 0s rather than NaNs
데이터에 대해 다음 유형의 계산을 수행하려면 numpy 배열을 사용합니다.
data = np.array([np.arange(10)]*3).T
따라서 Data Frame을 만들 수 있습니다.
In [10]: df = pd.DataFrame(data, index=index, columns=columns)
In [11]: df
Out[11]:
A B C
2012-11-29 0 0 0
2012-11-30 1 1 1
2012-12-01 2 2 2
2012-12-02 3 3 3
2012-12-03 4 4 4
2012-12-04 5 5 5
2012-12-05 6 6 6
2012-12-06 7 7 7
2012-12-07 8 8 8
2012-12-08 9 9 9
빈 데이터 프레임을 만들고 나중에 일부 착신 데이터 프레임으로 채우려면 다음을 수행하십시오.
newDF = pd.DataFrame() #creates a new dataframe that's empty
newDF = newDF.append(oldDF, ignore_index = True) # ignoring index is optional
# try printing some data from newDF
print newDF.head() #again optional
이 예에서는 이 판다 문서를 사용하여 새 데이터 프레임을 만든 다음 추가를 사용하여 새 데이터 프레임에 씁니다.oldDF의 데이터를 포함한 DF.
둘 이상의 오래된 DF에서 새로운 데이터를 이 newDF에 계속 추가해야 할 경우 for loop을 사용하여 판다를 반복합니다.DataFrame.append()
주의: append()는 버전 1.4.0 이후 폐지되었습니다.concat() 사용
열 이름을 사용하여 빈 프레임 초기화
import pandas as pd
col_names = ['A', 'B', 'C']
my_df = pd.DataFrame(columns = col_names)
my_df
프레임에 새 레코드 추가
my_df.loc[len(my_df)] = [2, 4, 5]
사전 전달을 원할 수도 있습니다.
my_dic = {'A':2, 'B':4, 'C':5}
my_df.loc[len(my_df)] = my_dic
기존 프레임에 다른 프레임 추가
col_names = ['A', 'B', 'C']
my_df2 = pd.DataFrame(columns = col_names)
my_df = my_df.append(my_df2)
퍼포먼스에 관한 고려사항
루프 내에 행을 추가할 경우 성능 문제를 고려하십시오.처음 1000개 안팎의 레코드에 대해서는 "my_df.loc"의 퍼포먼스가 향상되지만 루프 내의 레코드 수가 증가하면 점차 느려집니다.
큰 루프(예를 들어 1000만 레코드) 내에서 작업을 수행할 계획이라면 이 두 가지를 혼합하여 사용하는 것이 좋습니다. 사이즈가 약 1000이 될 때까지 데이터 프레임을 채운 다음 원래 데이터 프레임에 추가하고 임시 데이터 프레임을 비웁니다.그러면 성능이 약 10배 향상됩니다.
심플:
import numpy as np
import pandas as pd
df=pd.DataFrame(np.zeros([rows,columns])
그럼 채워주세요.
19개의 행이 있는 데이터 프레임을 가정합니다.
index=range(0,19)
index
columns=['A']
test = pd.DataFrame(index=index, columns=columns)
열 A를 상수로 유지
test['A']=10
열 b를 루프가 지정한 변수로 유지
for x in range(0,19):
test.loc[[x], 'b'] = pd.Series([x], index = [x])
는 기껏해야 할 수 요.pd.Series([x], index = [x])
이것은 루프가 있는 여러 목록에서 동적 데이터 프레임을 만드는 방법입니다.
x = [1,2,3,4,5,6,7,8]
y = [22,12,34,22,65,24,12,11]
z = ['as','ss','wa', 'ss','er','fd','ga','mf']
names = ['Bob', 'Liz', 'chop']
고리 모양의 고리
def dataF(x,y,z,names):
res = []
for t in zip(x,y,z):
res.append(t)
return pd.DataFrame(res,columns=names)
결과
dataF(x,y,z,names)
# import pandas library
import pandas as pd
# create a dataframe
my_df = pd.DataFrame({"A": ["shirt"], "B": [1200]})
# show the dataframe
print(my_df)
언급URL : https://stackoverflow.com/questions/13784192/creating-an-empty-pandas-dataframe-then-filling-it
'programing' 카테고리의 다른 글
__init__와 self는 Python에서 무엇을 합니까? (0) | 2022.10.08 |
---|---|
python matplotlib에서 축 문자 회전 (0) | 2022.10.08 |
MySQL - SELECT * OUTFILE LOCAL? (0) | 2022.10.02 |
이름(문자열)을 사용하여 모듈의 함수를 호출한다. (0) | 2022.10.02 |
"= null"과 "IS null"의 차이점은 무엇입니까? (0) | 2022.10.02 |