programing

빈 Panda DataFrame 생성 후 채우기

stoneblock 2023. 4. 24. 21:10

빈 Panda DataFrame 생성 후 채우기

여기 판다 데이터 프레임 문서부터 시작하겠습니다: 데이터 구조 소개

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가 출력되면 에 문의하십시오.

이 접근법의 장점:

  1. DataFrame(또는 NaN 중 하나)을 생성하여 여러 번 추가하는 것보다 목록에 추가하고 DataFrame을 한 번에 작성하는 것이 항상 저렴합니다.

  2. 리스트는 메모리 사용량도 적고 (필요한 경우) 작업, 추가 및 삭제가 훨씬가벼운 데이터 구조입니다.

  3. dtypes (할당하지 않고) 자동으로 추론됩니다.object( 에た )

  4. 각 반복 시 추가할 행에 올바른 인덱스를 할당하는 대신 A가 데이터에 대해 자동으로 생성됩니다.

아직 납득할 수 없는 경우는, 다음의 메뉴얼에도 기재되어 있습니다.

DataFrame에 행을 반복적으로 추가하는 것은 단일 연결보다 계산 부하가 더 높을 수 있습니다.더 나은 해결책은 이러한 행을 목록에 추가한 다음 목록을 원본 DataFrame과 연결하는 것입니다.

>= 1.4: *** 판다 업데이트 >= 1.4:append**

1. 【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.appendappend는 인플레이스 기능이 아니기 때문에 결과를 다시 할당해야 합니다.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」: 「Data Frame」)을할 수 .NaN 다음과 같이합니다.

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])

의 첫 번째 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-and-then-filling-it