python - 파이썬 - 판다 스 열 인덱싱




DataFrame 열의 순서를 변경하는 방법? (17)

나는 다음 DataFrame ( df )있다 :

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))

과제별로 더 많은 열을 추가합니다.

df['mean'] = df.mean(1)

mean 을 앞쪽으로 옮기는 방법, 즉 첫 번째 열로 설정하여 다른 열의 순서를 변경하지 않고 그대로 둘 수 있습니까?


2018 년 8 월부터 :

열 이름이 너무 길면 입력 할 수있는 정수 목록을 통해 새 순서를 지정할 수 있습니다.

new_order = [3,2,1,4,5,0]
df = df[df.columns[new_order]]
print(df)  

        a         c         b      mean         d         e
0  0.637589  0.634264  0.733961  0.617316  0.534911  0.545856
1  0.854449  0.830046  0.883416  0.678389  0.183003  0.641032
2  0.332996  0.195891  0.879472  0.545261  0.447813  0.870135
3  0.902704  0.843252  0.348227  0.677614  0.635780  0.658107
4  0.422357  0.529151  0.619282  0.412559  0.405749  0.086255
5  0.251454  0.940245  0.068633  0.554269  0.691631  0.819380
6  0.423781  0.179961  0.643971  0.361245  0.105050  0.453460
7  0.680696  0.487651  0.255453  0.419046  0.330417  0.341014
8  0.276729  0.473765  0.981271  0.690007  0.817877  0.900394
9  0.964470  0.248088  0.609391  0.463661  0.128077  0.368279

OP의 질문에 대한 구체적인 사례는 다음과 같습니다.

new_order = [-1,0,1,2,3,4]
df = df[df.columns[new_order]]
print(df)

      mean         a         b         c         d         e
0  0.595177  0.329206  0.713246  0.712898  0.572263  0.648273
1  0.638860  0.452519  0.598171  0.797982  0.858137  0.487490
2  0.287636  0.100442  0.244445  0.288450  0.285795  0.519049
3  0.653974  0.863342  0.460811  0.782644  0.827890  0.335183
4  0.285233  0.004613  0.485135  0.014066  0.489957  0.432394
5  0.430761  0.630070  0.328865  0.528100  0.031827  0.634943
6  0.444338  0.102679  0.808613  0.389616  0.440022  0.480759
7  0.536163  0.063105  0.420832  0.959125  0.643879  0.593874
8  0.556107  0.716114  0.180603  0.668684  0.262900  0.952237
9  0.416280  0.816816  0.064956  0.178113  0.377693  0.643820

"T"사용은 어떨까요?

df.T.reindex(['mean',0,1,2,3,4]).T

Wes McKinney가 제안한대로 insert() 함수를 사용해 보았습니다.

df.insert (0, 'mean', df.mean (1))

이것은 Timmie가 마지막 열을 이동할 필요없이 한 줄에 원하는 결과를 얻었습니다.


가장 간단한 방법은 다음과 같이 열 이름의 순서를 변경하는 것입니다.

df = df[['mean', Col1,Col2,Col3]]


귀하의 경우,

df = df.reindex_axis(['mean',0,1,2,3,4], axis=1)

당신이 원하는 것을 정확하게 할 것입니다.

내 경우 (일반적인 형태) :

df = df.reindex_axis(sorted(df.columns), axis=1)
df = df.reindex_axis(['opened'] + list([a for a in df.columns if a != 'opened']), axis=1)

2018 년 1 월 업데이트

reindex 을 사용하려면 다음을 수행하십시오.

df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))

기존 데이터 프레임을 수정하는 기존 열을 하나 옮기는 방법이 있습니다.

my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)

나는 비슷한 질문을 스스로했고, 내가 정한 것을 덧붙이고 싶었다. 나는 열 순서를 변경하기위한 reindex_axis() method 를 좋아했다. 이것은 효과가 있었다 :

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)

@Jorge의 주석을 기반으로하는 다른 방법 :

df = df.reindex(columns=['mean'] + list(df.columns[:-1]))

reindex_axisreindex 보다 마이크로 벤치 마크에서 약간 더 빠르지 만, 나는 후자가 그 직접성 때문에 선호한다고 생각합니다.


내가 Shoresh의 대답 을 당신이 위치를 모르는 때 열을 제거하는 설정 기능을 사용하는 것이 좋았지 만, 원래의 열 순서 (임의의 열 레이블이 있음)를 유지해야하므로 내 목적에는 효과가 없었습니다.

boltons 패키지의 IndexedSet을 사용 하여이 작업을 수행 할 수 있습니다.

또한 여러 열 레이블을 다시 추가해야하므로보다 일반적인 경우 다음 코드를 사용했습니다.

from boltons.setutils import IndexedSet
cols = list(IndexedSet(df.columns.tolist()) - set(['mean', 'std']))
cols[0:0] =['mean', 'std']
df = df[cols]

희망이 일반적인 솔루션이 스레드를 검색하는 사람에게 유용합니다.


다음은 임의의 수의 열에 대해이 작업을 수행하는 함수입니다.

def mean_first(df):
    ncols = df.shape[1]        # Get the number of columns
    index = list(range(ncols)) # Create an index to reorder the columns
    index.insert(0,ncols)      # This puts the last column at the front
    return(df.assign(mean=df.mean(1)).iloc[:,index]) # new df with last column (mean) first

당신은 다음을 할 수 있습니다 (Aman의 답변에서 부분을 빌리십시오) :

cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))

cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]

df = df[cols]

변경할 열 이름을 입력하고 새 위치의 색인을 설정하십시오.

def change_column_order(df, col_name, index):
    cols = df.columns.tolist()
    cols.remove(col_name)
    cols.insert(index, col_name)
    return df[cols]

귀하의 경우, 이것은 다음과 같습니다 :

df = change_column_order(df, 'mean', 0)


원하는 순서로 열의 새 목록을 작성한 다음 df = df[cols] 를 사용하여이 새로운 순서로 열을 다시 정렬해야합니다.

cols = ['mean']  + [col for col in df if col != 'mean']
df = df[cols]

좀 더 일반적인 접근법을 사용할 수도 있습니다. 이 예에서는 마지막 열 (-1로 표시됨)이 첫 번째 열로 삽입됩니다.

cols = [df.columns[-1]] + [col for col in df if col != df.columns[-1]]
df = df[cols]

이 방법을 사용하여 DataFrame에 원하는 순서로 열을 재정렬 할 수 있습니다.

inserted_cols = ['a', 'b', 'c']
cols = ([col for col in inserted_cols if col in df] 
        + [col for col in df if col not in inserted cols])
df = df[cols]

이 질문은 before 대답했지만 reindex_axis가 이제는 사용되지 않으므로 다음과 같이 사용하도록 제안합니다.

df.reindex(sorted(df.columns), axis=1)

임의의 열을 임의의 위치로 이동 :

import pandas as pd
df = pd.DataFrame({"A": [1,2,3], 
                   "B": [2,4,8], 
                   "C": [5,5,5]})

cols = df.columns.tolist()
column_to_move = "C"
new_position = 1

cols.insert(new_position, cols.pop(cols.index(column_to_move)))
df = df[cols]

한 가지 쉬운 방법은 필요에 따라 다시 정렬 된 열 목록으로 데이터 프레임을 재 할당하는 것입니다.

이것은 당신이 지금 가지고있는 것입니다 :

In [6]: df
Out[6]:
          0         1         2         3         4      mean
0  0.445598  0.173835  0.343415  0.682252  0.582616  0.445543
1  0.881592  0.696942  0.702232  0.696724  0.373551  0.670208
2  0.662527  0.955193  0.131016  0.609548  0.804694  0.632596
3  0.260919  0.783467  0.593433  0.033426  0.512019  0.436653
4  0.131842  0.799367  0.182828  0.683330  0.019485  0.363371
5  0.498784  0.873495  0.383811  0.699289  0.480447  0.587165
6  0.388771  0.395757  0.745237  0.628406  0.784473  0.588529
7  0.147986  0.459451  0.310961  0.706435  0.100914  0.345149
8  0.394947  0.863494  0.585030  0.565944  0.356561  0.553195
9  0.689260  0.865243  0.136481  0.386582  0.730399  0.561593

In [7]: cols = df.columns.tolist()

In [8]: cols
Out[8]: [0L, 1L, 2L, 3L, 4L, 'mean']

원하는 방식으로 cols 을 재정렬하십시오. 이것이 내가 마지막 요소를 첫 번째 위치로 이동 한 방법입니다.

In [12]: cols = cols[-1:] + cols[:-1]

In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]

그런 다음 아래와 같이 데이터 프레임을 재정렬하십시오.

In [16]: df = df[cols]  #    OR    df = df.ix[:, cols]

In [17]: df
Out[17]:
       mean         0         1         2         3         4
0  0.445543  0.445598  0.173835  0.343415  0.682252  0.582616
1  0.670208  0.881592  0.696942  0.702232  0.696724  0.373551
2  0.632596  0.662527  0.955193  0.131016  0.609548  0.804694
3  0.436653  0.260919  0.783467  0.593433  0.033426  0.512019
4  0.363371  0.131842  0.799367  0.182828  0.683330  0.019485
5  0.587165  0.498784  0.873495  0.383811  0.699289  0.480447
6  0.588529  0.388771  0.395757  0.745237  0.628406  0.784473
7  0.345149  0.147986  0.459451  0.310961  0.706435  0.100914
8  0.553195  0.394947  0.863494  0.585030  0.565944  0.356561
9  0.561593  0.689260  0.865243  0.136481  0.386582  0.730399

set() :

간단한 접근법은 set() 을 사용하는 것입니다. 특히 컬럼의 긴 목록을 가지고 있고 수동으로 처리하고 싶지 않을 때 :

cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]




pandas