it-source

행별로 반복하면서 판다의 데이터 프레임 업데이트

criticalcode 2022. 12. 19. 21:22
반응형

행별로 반복하면서 판다의 데이터 프레임 업데이트

다음과 같은 팬더 데이터 프레임이 있습니다(매우 큰 프레임).

           date      exer exp     ifor         mat  
1092  2014-03-17  American   M  528.205  2014-04-19 
1093  2014-03-17  American   M  528.205  2014-04-19 
1094  2014-03-17  American   M  528.205  2014-04-19 
1095  2014-03-17  American   M  528.205  2014-04-19    
1096  2014-03-17  American   M  528.205  2014-05-17 

이제 행별로 반복하고 각 행을 통해,ifor조건에 따라 각 행의 데이터가 변경될 수 있으므로 다른 데이터 프레임을 조회해야 합니다.

반복하면서 업데이트하려면 어떻게 해야 하나요?몇 가지 시도를 해봤지만 소용이 없었어

for i, row in df.iterrows():
    if <something>:
        row['ifor'] = x
    else:
        row['ifor'] = y

    df.ix[i]['ifor'] = x

이러한 접근법 중 어느 것도 효과가 없는 것 같습니다.데이터 프레임에서 값이 업데이트되지 않았습니다.

사용할 수 있습니다.df.at:

for i, row in df.iterrows():
    ifor_val = something
    if <condition>:
        ifor_val = something_else
    df.at[i,'ifor'] = ifor_val

0.21.0 이전 버전의 경우df.set_value:

for i, row in df.iterrows():
    ifor_val = something
    if <condition>:
        ifor_val = something_else
    df.set_value(i,'ifor',ifor_val)

행 값이 필요하지 않은 경우 다음 인덱스에 대해 간단히 반복할 수 있습니다.df여기에 표시되어 있지 않은 것에 대해 행 값이 필요할 경우를 대비해 원래의 for-loop을 보관하고 있습니다.

Panda Data Frame 객체는 일련의 시리즈로 간주해야 합니다.즉, 열을 기준으로 생각해야 합니다.이게 왜 중요한가 하면pd.DataFrame.iterrows열을 통해 연속적으로 반복하고 있습니다.그러나 이러한 시리즈는 데이터 프레임에 저장되는 시리즈가 아니므로 반복하는 동안 생성된 새 시리즈입니다.즉, 이러한 편집 내용을 할당하려고 해도 원래 데이터 프레임에 반영되지 않습니다.

좋아, 이제 그건 말도 안 되는 일이야.어떻게 해야 하죠?

이 투고에 앞서 다음과 같은 제안을 합니다.

  1. pd.DataFrame.set_value팬더 버전 0.21로 권장되지 않습니다.
  2. pd.DataFrame.ix권장되지 않음
  3. pd.DataFrame.loc정상이지만 어레이 인덱서로 작업할 수 있어 더 나은 작업을 수행할 수 있습니다.

추천할 만한 것
사용

for i in df.index:
    if <something>:
        df.at[i, 'ifor'] = x
    else:
        df.at[i, 'ifor'] = y

이 설정을 다음과 같이 변경할 수도 있습니다.

for i in df.index:
    df.at[i, 'ifor'] = x if <something> else y

코멘트에 대한 응답

if 조건으로 이전 행의 값을 사용해야 할 경우 어떻게 해야 합니까?

for i in range(1, len(df) + 1):
    j = df.columns.get_loc('ifor')
    if <something>:
        df.iat[i - 1, j] = x
    else:
        df.iat[i - 1, j] = y

사용할 수 있는 메서드는 입니다.이것은 명명된 튜플로서 DataFrame 행에 반복되며 인덱스 값은 태플의 첫 번째 요소로 사용됩니다.그리고 그것은 훨씬 더 빠릅니다.iterrows().위해서itertuples(),각각row그 포함Index데이터 프레임의 경우,loc값을 설정합니다.

for row in df.itertuples():
    if <something>:
        df.at[row.Index, 'ifor'] = x
    else:
        df.at[row.Index, 'ifor'] = x

    df.loc[row.Index, 'ifor'] = x

대부분의 경우,itertuples()보다 빠르다iat또는at.

@SantiStSupery님 감사합니다.사용은 보다 훨씬 빠릅니다.

다음을 기준으로 값을 할당해야 합니다.df.ix[i, 'exp']=X또는df.loc[i, 'exp']=X대신df.ix[i]['ifor'] = x.

그렇지 않으면 뷰에서 작업 중이기 때문에 워밍업을 해야 합니다.

-c:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead

그러나 루프는 아마도 벡터화된 알고리즘으로 대체되어야 합니다.DataFrame@필립 구름.

하시는 것이 lambda를 사용한 df.apply()-

df["ifor"] = df.apply(lambda x: {value} if {condition} else x["ifor"], axis=1)

df['Column'].values[i]

df['Column'] = ''

for i in range(len(df)):
    df['Column'].values[i] = something/update/new_value

또는 새 값을 이전 값과 비교하려면 목록에 저장한 후 마지막에 추가하는 것이 좋습니다.

mylist, df['Column'] = [], ''

for <condition>:
    mylist.append(something/update/new_value)

df['Column'] = mylist
for i, row in df.iterrows():
    if <something>:
        df.at[i, 'ifor'] = x
    else:
        df.at[i, 'ifor'] = y

List Concription(목록 이해)을 선택할 수 있습니다.

df['new_column'] = [your_func(x) for x in df['column']]

이것은 df['column']컬럼에 걸쳐 반복되며 함수를 df['column']의 값으로 your_func라고 부르고 새 컬럼 df['new_column']의 행에 값을 할당합니다.

잊지 말고 함수를 만들어 주세요.

컬럼에서 MAX 번호를 늘립니다.예:

df1 = [sort_ID, Column1,Column2]
print(df1)

출력:

Sort_ID Column1 Column2
12         a    e
45         b    f
65         c    g
78         d    h

MAX = df1['Sort_ID'].max() #This returns my Max Number 

여기서 df2에 컬럼을 생성하여 MAX가 증가하는 컬럼 값을 입력해야 합니다.

Sort_ID Column1 Column2
79      a1       e1
80      b1       f1
81      c1       g1
82      d1       h1

주의: df2에는 처음에는 Column1과 Column2만 포함됩니다.Sortid 컬럼을 생성하여 df1에서 MAX를 증분해야 합니다.

언급URL : https://stackoverflow.com/questions/23330654/update-a-dataframe-in-pandas-while-iterating-row-by-row

반응형