팬더 데이터 프레임에서 열 이동
다음과 같은 데이터 프레임이 있습니다.
a b x y
0 1 2 3 -1
1 2 4 6 -2
2 3 6 9 -3
3 4 8 12 -4
열 b와 x를 데이터 프레임의 마지막 두 열이 되도록 이동하려면 어떻게 해야 합니까?이름으로 밴드와 x를 지정하고 다른 열은 지정하지 않습니다.
열 순서를 지정하여 열을 직접 재정렬할 수 있습니다.
df = df[['a', 'y', 'b', 'x']]
열 제목이 동적인 대형 데이터 프레임의 경우 목록 이해를 사용하여 대상 집합에 없는 모든 열을 선택한 다음 대상 집합을 끝까지 추가할 수 있습니다.
>>> df[[c for c in df if c not in ['b', 'x']]
+ ['b', 'x']]
a y b x
0 1 -1 2 3
1 2 -2 4 6
2 3 -3 6 9
3 4 -4 8 12
방탄성을 높이기 위해 대상 열이 실제로 데이터 프레임에 있는지 확인할 수 있습니다.
cols_at_end = ['b', 'x']
df = df[[c for c in df if c not in cols_at_end]
+ [c for c in cols_at_end if c in df]]
예: 열을 이동하는 방법"name"
insert:를 사용할 수 있는 첫 번째 열 inf가 됩니다.
column_to_move = df.pop("name")
# insert column with insert(location, column_name, column_value)
df.insert(0, "name", column_to_move)
마찬가지로 이 열을 처음부터 세 번째 열로 지정하려면 다음과 같이 하십시오.
df.insert(2, "name", column_to_move )
cols = list(df.columns.values) #Make a list of all of the columns in the df
cols.pop(cols.index('b')) #Remove b from list
cols.pop(cols.index('x')) #Remove x from list
df = df[cols+['b','x']] #Create new dataframe with columns in the order you want
당신은 아래의 방법을 사용할 수 있습니다.매우 간단하지만 찰리 헤일리의 좋은 대답과 비슷합니다.
df1 = df.pop('b') # remove column b and store it in df1
df2 = df.pop('x') # remove column x and store it in df2
df['b']=df1 # add b series as a 'new' column.
df['x']=df2 # add b series as a 'new' column.
이제 데이터 프레임 끝에 'b'와 'x' 열이 있습니다.OSPY: https://youtu.be/RlbO27N3Xg4 에서 이 비디오를 볼 수 있습니다.
위의 ROBAT1의 답변과 비슷하지만, 조금 더 강력했으면 좋겠습니다.
df.insert(len(df.columns)-1, 'b', df.pop('b'))
df.insert(len(df.columns)-1, 'x', df.pop('x'))
이 함수는 데이터 손실 없이 열 순서를 변경합니다.생략된 열은 데이터 집합의 중앙에 남아 있습니다.
def reorder_columns(columns, first_cols=[], last_cols=[], drop_cols=[]):
columns = list(set(columns) - set(first_cols))
columns = list(set(columns) - set(drop_cols))
columns = list(set(columns) - set(last_cols))
new_order = first_cols + columns + last_cols
return new_order
사용 예:
my_list = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']
reorder_columns(my_list, first_cols=['fourth', 'third'], last_cols=['second'], drop_cols=['fifth'])
# Output:
['fourth', 'third', 'first', 'sixth', 'second']
데이터 프레임에 할당하려면 다음을 사용합니다.
my_list = df.columns.tolist()
reordered_cols = reorder_columns(my_list, first_cols=['fourth', 'third'], last_cols=['second'], drop_cols=['fifth'])
df = df[reordered_cols]
간단한 솔루션:
old_cols = df.columns.values
new_cols= ['a', 'y', 'b', 'x']
df = df.reindex(columns=new_cols)
대안적이고 보다 일반적인 방법
from pandas import DataFrame
def move_columns(df: DataFrame, cols_to_move: list, new_index: int) -> DataFrame:
"""
This method re-arranges the columns in a dataframe to place the desired columns at the desired index.
ex Usage: df = move_columns(df, ['Rev'], 2)
:param df:
:param cols_to_move: The names of the columns to move. They must be a list
:param new_index: The 0-based location to place the columns.
:return: Return a dataframe with the columns re-arranged
"""
other = [c for c in df if c not in cols_to_move]
start = other[0:new_index]
end = other[new_index:]
return df[start + cols_to_move + end]
그런 다음 와 함께 사용하거나 레이블 기반 인덱싱을 사용할 수 있습니다.일반적으로 NumPy / Pandas 개체를 사용하는 목록 이해 또는 기타 명시적 루프를 피하는 것이 좋습니다.
cols_to_move = ['b', 'x']
new_cols = np.hstack((df.columns.difference(cols_to_move), cols_to_move))
# OPTION 1: reindex
df = df.reindex(columns=new_cols)
# OPTION 2: direct label-based indexing
df = df[new_cols]
# OPTION 3: loc label-based indexing
df = df.loc[:, new_cols]
print(df)
# a y b x
# 0 1 -1 2 3
# 1 2 -2 4 6
# 2 3 -3 6 9
# 3 4 -4 8 12
Python에서 열 이동 패키지를 사용하여 열을 이동할 수 있습니다.
pip install movecolumn
그런 다음 코드를 다음과 같이 작성할 수 있습니다.
import movecolumn as mc
mc.MoveToLast(df,'b')
mc.MoveToLast(df,'x')
도움이 되길 바랍니다.
추신: 패키지는 여기에서 찾을 수 있습니다.https://pypi.org/project/movecolumn/
댓글 중 하나당 라이너 하나:
df.insert(0, 'name', df.pop('name'))
단연코 가장 효율적입니다.
한 줄로 이 작업을 수행할 수도 마찬가지입니다.
df.drop(columns=['b', 'x']).assign(b=df['b'], x=df['x'])
그러면 열이 마지막 열로 이동합니다.
- 데이터 프레임의 마지막 열로 열을 이동합니다.
df= df[ [ col for col in df.columns if col != 'col_name_to_moved' ] + ['col_name_to_moved']]
- 데이터 프레임의 첫 번째 열로 열을 이동합니다.
df= df[ ['col_name_to_moved'] + [ col for col in df.columns if col != 'col_name_to_moved' ]]
여기서 col_name_to_message는 이동할 열입니다.
열을 이동하는 방법x
다른 칸 앞에y
:
col_idx = df.columns.tolist().index('y')
col_mv = df.pop('x')
df.insert(col_idx, 'x', col_mv)
저는 포켓몬 데이터베이스를 예로 들며, 제 데이터베이스의 열은 다음과 같습니다.
['Name', '#', 'Type 1', 'Type 2', 'Total', 'HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed', 'Generation', 'Legendary']
코드는 다음과 같습니다.
import pandas as pd
df = pd.read_html('https://gist.github.com/armgilles/194bcff35001e7eb53a2a8b441e8b2c6')[0]
cols = df.columns.to_list()
cos_end= ["Name", "Total", "HP", "Defense"]
for i, j in enumerate(cos_end, start=(len(cols)-len(cos_end))):
cols.insert(i, cols.pop(cols.index(j)))
print(cols)
df = df.reindex(columns=cols)
print(df)
언급URL : https://stackoverflow.com/questions/35321812/move-column-in-pandas-dataframe
'programing' 카테고리의 다른 글
Efcore: MaxAsync를 수행할 때 시퀀스에 요소가 없습니다. (0) | 2023.09.04 |
---|---|
발견되지 않은 구문 오류: 'Document'에서 'querySelector'를 실행하지 못했습니다. (0) | 2023.09.04 |
phpmyadmin에서 mySQL 서버 IP 주소를 찾는 방법 (0) | 2023.09.04 |
유닛 테스트를 실행하는 동안 mariadb를 시작하는 방법 (0) | 2023.09.04 |
CSS 셀렉터에서 '>'와 공백의 차이점은 무엇입니까? (0) | 2023.09.04 |