Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python Pandas에서 템플릿을 사용하여 DataFrame에 새 행을 추가하는 방법

<시간/>

Python Pandas에서 템플릿을 사용하여 DataFrame에 새 행을 추가하는 방법.

소개

데이터 엔지니어링 전문가이기 때문에 분석을 위해 데이터를 생성하고 나에게 보내는 역할은 다른 데이터베이스 전문가가 처리해야 하기 때문에 종종 행보다 파생된 열을 더 많이 생성하게 됩니다. 그러나 항상 사실은 아닙니다.

데이터 전문가 팀이 데이터를 보낼 때까지 기다리기보다 샘플 행을 만들어야 합니다. 이 주제에서 나는 행을 생성하는 깔끔한 트릭을 보여줄 것입니다.

그것을 하는 방법..

이 레시피에서는 .loc 속성을 사용하여 작은 데이터세트에 행을 추가한 다음 .append 메서드를 사용합니다.

1.나중에 행을 추가할 데이터 프레임을 만드는 것으로 시작하겠습니다.

판다를 pdimport numpy로 npplayers_info =pd.DataFrame(data=[{"players":"Roger Federer", "titles":20},{"players":"Rafael Nadal", "titles":20)로 가져오기 },{"선수":"노박 조코비치", "제목":17},{"선수":"앤디 머레이", "제목":3}], 열=["선수", "제목"]) 

출력

print(players_info.info())

RangeIndex:4개 항목, 0~3개 데이터 열(총 2개 열):# 열 Null이 아닌 개수 Dtype--- ------ ---- ---------- -----0 플레이어 4 널이 아닌 object1 제목 4 널이 아닌 int64dtypes:int64(1), object(1) 메모리 사용량:192.0+ bytesNone

1. 이제 .loc 속성을 사용하여 데이터 프레임에 새 플레이어 "Dominic Theim"을 추가해 보겠습니다.

new_Player =['Dominic Theim', 1]players_info.loc[4] =new_Player

출력

인쇄(players_info)


선수 타이틀0 로저 페더러 201 라파엘 나달 202 노박 조코비치 173 앤디 머레이 34 도미닉 테임 1

1. 동일한 .loc 속성을 사용하여 데이터 프레임의 끝에 새 행을 추가합니다. 여기에서 데이터 프레임에 사전을 추가하는 방법을 보여드리겠습니다.

new_player ={'players':'Daniel Medvedev', 'titles':0}players_info.loc[len(players_info)] =new_player

출력

인쇄(players_info)


선수 타이틀0 로저 페더러 201 라파엘 나달 202 노박 조코비치 173 앤디 머레이 34 도미닉 테임 15 다니엘 메드베데프 0

1. 데이터를 담고 있는 pandas 시리즈를 데이터 프레임에 추가할 수도 있습니다.

players_info.loc[len(players_info)] =pd.Series({'players':'Andy Zverev', 'titles':0})

출력

인쇄(players_info)
선수 타이틀0 로저 페더러 201 라파엘 나달 202 노박 조코비치 173 앤디 머레이 34 도미닉 테임 15 다니엘 메드베데프 06 앤디 즈베레프 0

결론

.loc 메서드를 사용하여 위의 4단계로 데이터를 추가했습니다. .loc 속성은 제자리에서 DataFrame을 변경합니다.

다음 몇 단계에서는 호출하는 DataFrame을 수정하지 않고 추가된 행이 있는 DataFrame의 새 복사본을 반환하는 .append 메서드를 살펴보겠습니다.

.append의 첫 번째 인수는 다른 DataFrame, Series, 사전 또는 목록이어야 합니다.

# indexplayers_info =pd.DataFrame(data=[{"players":"Roger Federer", "titles":20},{"players":"Rafael Nadal", "titles":20}로 DataFrame 생성 ,{"선수":"노박 조코비치", "제목":17},{"선수":"앤디 머레이", "제목":3}], 열=["선수", "제목"],index=["로저", "나달", "조코비치", "머레이"])


# .append method.players_info.append({'players':'Daniel Medvedev', 'titles':0})를 사용하여 DataFrame에 새 행(사전) 추가


---------------------------------------------- ----------------------------TypeError Traceback(가장 최근 호출 마지막)---------------- -------------------------------------------------- -----------TypeError Traceback (가장 최근 호출 마지막)in1 # .append 메서드를 사용하여 DataFrame에 새 행(사전)을 추가합니다.----> 2players_info.append({'players':'Daniel Medvedev', 'titles':0})~\anaconda3\lib\site-packages\pandas\core\frame.py in append(self, other, ignore_index, verify_integrity, sort)7046 other =Series(other)7047 if other.name이 None이고 ignore_index가 아닌 경우:-> 7048 raise TypeError(7049 "Can only append a Series if ignore_index=True "7050 "or if the Series has name"

TypeError ignore_index=True 또는 Series에 이름이 있는 경우에만 Series를 추가할 수 있습니다.

사전을 추가하려고 하면 ignore_index=True 매개변수를 사용하도록 요청하는 예외가 발생했습니다. 이 제안된 매개변수를 추가하고 어떤 기능을 하는지 살펴보겠습니다.

new_df =players_info.append({'players':'Daniel Medvedev', 'titles':0}, ignore_index=True)

출력

print(f" *** 색인이 있는 원본 \n {players_info} \n\n\n *** 수정된 색인 \n {new_df}")


*** 인덱스 플레이어 타이틀이 포함된 원본:Roger Federer 20나달 Rafael Nadal 20djokovic Novak Djokovic 17murray Andy Murray 3*** 수정된 인덱스 플레이어 타이틀0 Roger Federer 201 Rafael Nadal 202 Novak Djokovic 173 Andyve Murray 34
ignore_index=True 매개변수를 사용한 후 출력에서 ​​무엇을 관찰했습니까? 예, ignore_index를 True로 설정하면 이전 인덱스가 완전히 제거되고 0에서 n-1 사이의 RangeIndex로 대체됩니다.

.append 메소드는 DataFrame에 한 번에 많은 행을 추가하려는 경우에 매우 유용합니다.

player1 =pd.Series({'players':'Andy Zverev', 'titles':0}, name='zverev')player2 =pd.Series({'players':'Dominic Theim', 'titles ':1}, 이름='theim')new_df_1 =players_info.append([player1, player2])

출력

인쇄(new_df_1)
선수 타이틀 로저 페더러 20나달 라파엘 나달 20조코비치 노박 조코비치 17머레이 Andy Murray 3zverev Andy Zverev 0theim Dominic Theim 1

자, 이제 행을 추가하는 방법에 대한 기본 사항을 보았으므로 열이 많은 데이터 프레임에 행을 추가하는 방법에 대해 알아보겠습니다.

df =pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")

출력

인쇄(df.info())

RangeIndex:4803개 항목, 0 ~ 4802개 Data 열(총 12개 열):# Column Non-Null Count Dtype--- ------ ---- ---------- -----0 예산 4803 null이 아닌 int641 id 4803 null이 아닌 int642 original_language 4803 null이 아닌 object3 original_title 4803 null이 아닌 object4 인기도 4803 null이 아닌 float645 release_date 4802 non- null object6 수익 4803 null이 아닌 int647 런타임 4801 non-null float648 status 4803 null이 아닌 object9 title 4803 null이 아닌 object10 vote_average 4803 non-null float6411 vote_count 4803 non-null int64dtypes4, int64dtypes:float6 (5) 메모리 사용량:450.4+KBNone

Google의 이 데이터세트에는 12개의 열이 있으며 새 데이터 행을 수동으로 입력하는 경우 열 이름을 잘못 입력하거나 아예 잊어버리기가 매우 쉽습니다. 그러면 이 문제를 어떻게 피할 수 있습니까? 방법이 있습니다. 열 이름 템플릿을 생성하면 됩니다.

columns_dictionary =df.iloc[0].to_dict()
##### 출력:


인쇄(columns_dictionary)


{'예산':237000000, 'id':19995, 'original_language':'en', 'original_title':'아바타', '인기':150.437577, '출시일':'109'12,2 '수익':2787965087, '런타임':162.0, '상태':'출시', '제목':'아바타', '투표_평균':7.2, '투표_수':11800}

이제 첫 번째 행을 가져와 사전으로 변환했다는 것을 이해할 수 있을 것입니다. 열과 값도 얻었습니다. 이제 이전 문자열 값을 빈 문자열로 할당하는 사전 이해로 이전 값을 지우겠습니다. 나머지는 모두 결측값입니다.

이 사전은 이제 입력하려는 모든 새 데이터의 템플릿 역할을 할 수 있습니다.

import datetimenew_data_dict ={}for a, b in columns_dictionary.items():if isinstance(b, str):new_data_dict[a] =np.random.choice(list('abcde'))elif isinstance(b, datetime.date):new_data_dict[a] =np.nanelse:new_data_dict[a] =np.nan

출력

인쇄(new_data_dict)


{'예산':nan, 'id':nan, 'original_language':'e', ​​'original_title':'a', '인기':nan, 'release_date':'b', '수익':nan, '런타임':nan, 'status':'e', ​​'title':'c', 'vote_average':nan, 'vote_count':nan}