IT

오류 ""DataFrame' 개체에 '첨부' 속성이 없습니다."

itgroup 2023. 9. 15. 20:56
반응형

오류 ""DataFrame' 개체에 '첨부' 속성이 없습니다."

DataFrame 개체에 사전을 추가하려고 하는데 다음 오류가 발생합니다.

AttributeError: 'DataFrame' 개체에 'append' 속성이 없습니다.

제가 알기로는, DataFrame에는 "첨부"라는 방법이 있습니다.

코드 조각:

df = pd.DataFrame(df).append(new_row, ignore_index=True)

나는 그 사전을 기대하고 있었습니다.new_row새 행으로 추가됩니다.

어떻게 고치죠?

팬더 2.0 기준으로.append(이전에는 사용하지 않음)이(가) 제거되었습니다.

대부분의 애플리케이션에 대해 대신 다음을 사용해야 합니다.

df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True)

@cottontail에서 언급한 바와 같이 사용할 수도 있지만, 이는 새 인덱스가 DataFrame에 아직 없는 경우에만 작동합니다(일반적으로 인덱스가 다음과 같은 경우에 해당됨).RangeIndex:

df.loc[len(df)] = new_row # only use with a RangeIndex!

왜 없앴죠?

우리는 팬더의 사용자들이 순수한 파이썬으로 하는 것처럼 코딩을 시도하는 것을 자주 봅니다.루프에서 항목에 액세스하는 데 사용합니다(여기에서 사용하지 않아야 하는 이유 참조).append파이썬과 비슷한 방법으로

하지만, 팬더의 호 #35407에서 언급되었듯이, 팬더와 팬더는 실제로 같은 것이 아닙니다.list.append팬더들은 제자리에 있고 팬더들은append새 DataFrame을 만듭니다.

Series.append와 DataFrame.append를 사용하지 않는 것이 좋을 것 같습니다.그들은 list.append와 유사한 것을 만들고 있지만, 동작이 맞지 않고 있을 수도 없기 때문에 이는 잘못된 비유입니다.결과를 생성하려면 인덱스 및 값에 대한 데이터를 복사해야 합니다.

이것들은 분명히 대중적인 방법이기도 합니다.DataFrame.append는 API 문서에서 10번째로 많이 방문한 페이지입니다.

제가 착각하지 않는 한, 사용자는 항상 값 목록을 작성하여 작성자에게 전달하거나 NDFrames 목록을 작성한 후 하나의 콘캣을 작성하는 것이 좋습니다.

결과적으로, 반면에list.append는 루프의 각 단계에서 O(1)을 상각하고, 팬더' 반복 삽입을 수행할 때 비효율적입니다.

이 과정을 반복해야 할 경우에는 어떻게 합니까?

사용.append아니면concat반복적으로 좋은 아이디어는 아닙니다(이는 각 단계에 대해 새로운 DataFrame을 생성할 때 2차적으로 동작합니다).

이 경우, 새로운 항목은 목록에 수집되어야 하며, 루프가 끝날 때 다음으로 변환됩니다.DataFrame그리고 결국 원작에 연결되고 말았습니다.DataFrame.

lst = []

for new_row in items_generation_logic:
    lst.append(new_row)

# create extension
df_extended = pd.DataFrame(lst, columns=['A', 'B', 'C'])
# or columns=df.columns if identical columns

# concatenate to original
out = pd.concat([df, df_extended])

줄이면.loc그 일을 할 수도 있습니다.

df.loc[len(df)] = new_row

loc이 인덱스 출,터스로다이됩니다.len(df)가 가 에만 이 과 이 에만 가 과 RangeIndex;RangeIndex명시적 인덱스가 데이터 프레임 생성자에게 전달되지 않으면 기본적으로 생성됩니다.

작동 예:

df = pd.DataFrame({'A': range(3), 'B': list('abc')})
df.loc[len(df)] = [4, 'd']
df.loc[len(df)] = {'A': 5, 'B': 'e'}
df.loc[len(df)] = pd.Series({'A': 6, 'B': 'f'})

result


, , 에서, 하는, 를 사용하여 을 확장하는 .DataFrame.append아니면concat아니면loc을 확대하고 한 번 하기 위해 코드를 작성하는 해 보십시오 Python 하고 을 을 하기 합니다 를 을 하는 합니다 을 하는 을 를

@mozway가 지적한 바와 같이 팬더 데이터 프레임을 확대하는 것은 각 반복에서 전체 데이터 프레임을 읽고 복사해야 하기 때문에 O(n^2) 복잡도를 가집니다.다음 성능 그림은 한 1번 수행된 연결에 대한 런타임 차이를 보여 줍니다.보다시피, 데이터 프레임을 확장하는 두 가지 방법 모두 목록을 확장하고 데이터 프레임을 한 번 구성하는 것보다 훨씬, 훨씬 느립니다(예: 10k 행의 데이터 프레임의 경우,concat에서 약 더 느리고배 800더고고약고고더n약0loc루프에서 약 1600배 느려짐).

perfplot

1 퍼펙트 플롯을 생성하는 데 사용되는 코드:

import pandas as pd
import perfplot

def concat_loop(lst):
    df = pd.DataFrame(columns=['A', 'B'])
    for dic in lst:
        df = pd.concat([df, pd.DataFrame([dic])], ignore_index=True)
    return df.infer_objects()
    
def concat_once(lst):
    df = pd.DataFrame(columns=['A', 'B'])
    df = pd.concat([df, pd.DataFrame(lst)], ignore_index=True)
    return df.infer_objects()

def loc_loop(lst):
    df = pd.DataFrame(columns=['A', 'B'])
    for dic in lst:
        df.loc[len(df)] = dic
    return df


perfplot.plot(
    setup=lambda n: [{'A': i, 'B': 'a'*(i%5+1)} for i in range(n)],
    kernels=[concat_loop, concat_once, loc_loop],
    labels= ['concat in a loop', 'concat once', 'loc in a loop'],
    n_range=[2**k for k in range(16)],
    xlabel='Length of dataframe',
    title='Enlarging a dataframe in a loop',
    relative_to=1,
    equality_check=pd.DataFrame.equals);

면책 사항: 이 답변은 인기를 끄는 것 같지만, 제안된 접근 방식을 사용해서는 안 됩니다.append로 변경되지 않았습니다._append,_append개인 내부 방식이고append팬더 API에서 제거되었습니다."판다의 방법 목록과 비슷해 보입니다. 파이썬에 첨부합니다. 그렇기 때문에 팬더의 부록 방법이 ""수정되었습니다."는 완전히 잘못된 것입니다.선두를_단 한 가지를 의미합니다: 이 방법은 비공개이며 팬더의 내부 코드 밖에서 사용하기 위한 것이 아닙니다.


팬더의 새로운 버전에서는.append메소드가 다음으로 변경됩니다._append. 간단히 사용할 수 있습니다._append에 대신에append를 들면, , , , , .df._append(df2).

df = df1._append(df2,ignore_index=True)

왜 바뀌었습니까?

append팬더의 method는 list.append in python과 비슷해 보입니다.그것이 팬더의 부록 방법이 현재 수정된 이유입니다._append.

AttributeError: 'DataFrame' 개체에 'append' 속성이 없습니다.'_append'를 말씀하신 건가요?

TensorFlow 2.12의 호환성을 갖춘 Panda의 경우, 사용자는 성공을 위해 작은 변화를 주기만 하면 됩니다.

all_data = train_df.append(test_df)

append를 _append로 변경

all_data = train_df._append(test_df)

그러면 프로그램이 올바르게 실행될 수 있습니다.

언급URL : https://stackoverflow.com/questions/75956209/error-dataframe-object-has-no-attribute-append

반응형