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 도미닉 테임 11. 동일한 .loc 속성을 사용하여 데이터 프레임의 끝에 새 행을 추가합니다. 여기에서 데이터 프레임에 사전을 추가하는 방법을 보여드리겠습니다.
new_player ={'players':'Daniel Medvedev', 'titles':0}players_info.loc[len(players_info)] =new_player출력
인쇄(players_info)
선수 타이틀0 로저 페더러 201 라파엘 나달 202 노박 조코비치 173 앤디 머레이 34 도미닉 테임 15 다니엘 메드베데프 01. 데이터를 담고 있는 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 34ignore_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}