다른 열에 데이터가 있지만 추출하여 다른 변수에 저장하는 방법을 모르겠습니다.
index abc 1 2 3 4 2 3 4 5
'a'
, 'b'
하고 df1에 저장하려면 어떻게 해야 합니까?
나는 시도했다
df1 = df['a':'b'] df1 = df.ix[:, 'a':'b']
아무도 작동하지 않는 것 같습니다.
질문자 :user1234440
다른 열에 데이터가 있지만 추출하여 다른 변수에 저장하는 방법을 모르겠습니다.
index abc 1 2 3 4 2 3 4 5
'a'
, 'b'
하고 df1에 저장하려면 어떻게 해야 합니까?
나는 시도했다
df1 = df['a':'b'] df1 = df.ix[:, 'a':'b']
아무도 작동하지 않는 것 같습니다.
열 이름(문자열)은 시도한 방식으로 슬라이싱할 수 없습니다.
여기에 몇 가지 옵션이 있습니다. __getitem__
구문 ([])에 목록을 전달하여 해당 열의 보기만 반환할 수 있습니다.
df1 = df[['a', 'b']]
또는 이름이 아닌 숫자로 인덱싱하는 것이 중요한 경우(예: 처음 두 열의 이름을 모른 채 코드에서 자동으로 이 작업을 수행해야 함) 대신 다음을 수행할 수 있습니다.
df1 = df.iloc[:, 0:2] # Remember that Python does not slice inclusive of the ending index.
또한 Pandas 개체에 대한 보기와 해당 개체의 복사본에 대한 개념을 숙지해야 합니다. 위의 방법 중 첫 번째는 원하는 하위 개체(원하는 슬라이스)의 메모리에 새 복사본을 반환합니다.
그러나 때때로 Pandas에는 이 작업을 수행하지 않고 대신 원본 개체의 하위 개체 또는 슬라이스와 동일한 메모리 덩어리를 참조하는 새 변수를 제공하는 인덱싱 규칙이 있습니다. 이것은 두 번째 인덱싱 방법에서 발생하므로 .copy()
메서드로 수정하여 일반 복사본을 얻을 수 있습니다. 이 경우 슬라이스된 개체라고 생각하는 것을 변경하면 때때로 원래 개체가 변경될 수 있습니다. 항상 이것을 조심하는 것이 좋습니다.
df1 = df.iloc[0, 0:2].copy() # To avoid the case where changing df1 also changes df
iloc
을 사용하려면 열 위치(또는 인덱스)를 알아야 합니다. 칼럼 위치가 변경 될 수 있으므로 대신 하드 코딩 인덱스의 경우 사용 iloc
함께 get_loc
의 기능 columns
열 인덱스를 얻기 위해 dataframe 물체의 제조 방법.
{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}
이제 이 사전을 사용하여 이름을 통해 열에 액세스하고 iloc
을 사용할 수 있습니다.
버전 0.11.0부터 .loc
인덱서를 사용하여 시도한 방식으로 열을 슬라이싱할 수 있습니다.
df.loc[:, 'C':'E']
와 동등하다
df[['C', 'D', 'E']] # or df.loc[:, ['C', 'D', 'E']]
C
E
까지의 열을 반환합니다.
무작위로 생성된 DataFrame에 대한 데모:
import pandas as pd import numpy as np np.random.seed(5) df = pd.DataFrame(np.random.randint(100, size=(100, 6)), columns=list('ABCDEF'), index=['R{}'.format(i) for i in range(100)]) df.head() Out: ABCDEF R0 99 78 61 16 73 8 R1 62 27 30 80 7 76 R2 15 53 80 27 44 77 R3 75 65 47 30 84 86 R4 18 9 41 62 1 82
C에서 E로 열을 가져오려면(정수 슬라이싱과 달리 'E'가 열에 포함됨):
df.loc[:, 'C':'E'] Out: CDE R0 61 16 73 R1 30 80 7 R2 80 27 44 R3 47 30 84 R4 41 62 1 R5 5 58 0 ...
레이블을 기반으로 행을 선택하는 경우에도 동일하게 작동합니다. 해당 열에서 'R6'에서 'R10'까지의 행을 가져옵니다.
df.loc['R6':'R10', 'C':'E'] Out: CDE R6 51 27 31 R7 83 19 18 R8 11 67 65 R9 78 27 29 R10 7 16 94
.loc
은 또한 부울 배열을 허용하므로 배열에서 해당 항목이 True
인 열을 선택할 수 있습니다. 예를 들어, df.columns.isin(list('BCD'))
은 array([False, True, True, True, False, False], dtype=bool)
- 열 이름이 목록에 있으면 True를 반환합니다. ['B', 'C', 'D']
; 그렇지 않으면 거짓입니다.
df.loc[:, df.columns.isin(list('BCD'))] Out: BCD R0 78 61 16 R1 27 30 80 R2 53 80 27 R3 65 47 30 R4 9 41 62 R5 78 5 58 ...
열 이름( df.columns
)이 ['index','a','b','c']
하면 원하는 데이터는 세 번째와 네 번째 열에 있습니다. 스크립트가 실행될 때 이름을 모르는 경우 다음을 수행할 수 있습니다.
newdf = df[df.columns[2:4]] # Remember, Python is zero-offset! The "third" entry is at slot two.
EMS가 그의 답변 에서 df.ix
열을 좀 더 간결하게 슬라이스하지만 .columns
슬라이스 인터페이스는 바닐라 1차원 Python 목록 인덱싱/슬라이싱 구문을 사용하기 때문에 더 자연스러울 수 있습니다.
경고 : 'index'
DataFrame
열의 잘못된 이름입니다. 동일한 레이블이 실제 df.index
속성인 Index
배열에도 사용됩니다. 따라서 열은 df['index']
의해 반환되고 실제 DataFrame 인덱스는 df.index
의해 반환됩니다. Index
는 요소 값 조회에 최적화된 특별한 종류의 Series
df.index의 경우 레이블로 행을 조회하기 위한 것입니다. 해당 df.columns
속성은 레이블로 열을 찾기 위한 pd.Index
최신 버전의 Pandas에는 이것을 정확하게 수행하는 쉬운 방법이 있습니다. 열 이름(문자열)은 원하는 방식으로 슬라이싱 할 수 있습니다.
columns = ['b', 'c'] df1 = pd.DataFrame(df, columns=columns)
In [39]: df Out[39]: index abc 0 1 2 3 4 1 2 3 4 5 In [40]: df1 = df[['b', 'c']] In [41]: df1 Out[41]: bc 0 3 4 1 4 5
팬더와 함께,
재치 있는 열 이름
dataframe[['column1','column2']]
iloc 및 인덱스 번호가 있는 특정 열로 선택하려면:
dataframe.iloc[:,[1,2]]
loc 열 이름은 다음과 같이 사용할 수 있습니다.
dataframe.loc[:,['column1','column2']]
삭제할 열 목록을 제공하고 Pandas DataFrame에서 drop()
함수를 사용하여 필요한 열만 DataFrame으로 반환할 수 있습니다.
그냥 말
colsToDrop = ['a'] df.drop(colsToDrop, axis=1)
b
와 c
열만 있는 DataFrame 을 반환합니다.
drop
방법은 여기 에 문서화되어 있습니다.
이 방법이 매우 유용하다는 것을 알았습니다.
# iloc[row slicing, column slicing] surveys_df.iloc [0:3, 1:4]
자세한 내용은 여기 에서 찾을 수 있습니다.
0.21.0부터 하나 이상의 누락된 레이블이 있는 목록과 함께 .loc
또는 []
.reindex
를 위해 더 이상 사용되지 않습니다. 따라서 귀하의 질문에 대한 답변은 다음과 같습니다.
df1 = df.reindex(columns=['b','c'])
이전 버전에서 .loc[list-of-labels]
를 사용하면 키 중 하나 이상이 발견되는 한 작동했습니다(그렇지 않으면 KeyError
). 이 동작은 더 이상 사용되지 않으며 이제 경고 메시지를 표시합니다. 권장되는 대안은 .reindex()
를 사용하는 것입니다.
데이터 인덱싱 및 선택 에서 자세히 읽어보세요.
pandas.DataFrame.filter
메서드를 사용하여 다음과 같이 열을 필터링하거나 재정렬할 수 있습니다.
df1 = df.filter(['a', 'b'])
이것은 또한 메서드를 연결할 때 매우 유용합니다.
판다를 사용할 수 있습니다.
DataFrame을 만듭니다.
import pandas as pd df = pd.DataFrame([[1, 2,5], [5,4, 5], [7,7, 8], [7,6,9]], index=['Jane', 'Peter','Alex','Ann'], columns=['Test_1', 'Test_2', 'Test_3'])
데이터 프레임:
Test_1 Test_2 Test_3 Jane 1 2 5 Peter 5 4 5 Alex 7 7 8 Ann 7 6 9
이름으로 하나 이상의 열을 선택하려면 다음을 수행합니다.
df[['Test_1', 'Test_3']] Test_1 Test_3 Jane 1 5 Peter 5 5 Alex 7 8 Ann 7 9
다음을 사용할 수도 있습니다.
df.Test_2
그리고 Test_2 열을 Test_2
.
Jane 2 Peter 4 Alex 7 Ann 6
.loc()
사용하여 이러한 행에서 열과 행을 선택할 수도 있습니다. 이것을 "슬라이싱"이라고 합니다. Test_1
열에서 Test_3 으로 Test_3
.
df.loc[:, 'Test_1':'Test_3']
"슬라이스"는 다음과 같습니다.
Test_1 Test_2 Test_3 Jane 1 2 5 Peter 5 4 5 Alex 7 7 8 Ann 7 6 9
Test_1
및 Test_3
열에서 Peter
와 Ann
을 원하는 경우:
df.loc[['Peter', 'Ann'], ['Test_1', 'Test_3']]
당신은 얻을:
Test_1 Test_3 Peter 5 5 Ann 7 9
행 인덱스와 열 이름으로 하나의 요소를 얻으려면 df['b'][0]
처럼 할 수 있습니다. 그것은 당신이 상상할 수있는만큼 간단합니다.
또는 인덱스와 레이블을 혼합하여 사용하는 df.ix[0,'b']
참고: v0.20부터 ix
loc
/ iloc
을 위해 더 이상 사용되지 않습니다.
다른 쉬운 접근 방식: 행 반복
df1 = pd.DataFrame() # Creating an empty dataframe for index,i in df.iterrows(): df1.loc[index, 'A'] = df.loc[index, 'A'] df1.loc[index, 'B'] = df.loc[index, 'B'] df1.head()
df[['a', 'b']] # Select all rows of 'a' and 'b'column df.loc[0:10, ['a', 'b']] # Index 0 to 10 select column 'a' and 'b' df.loc[0:10, 'a':'b'] # Index 0 to 10 select column 'a' to 'b' df.iloc[0:10, 3:5] # Index 0 to 10 and column 3 to 5 df.iloc[3, 3:5] # Index 3 of column 3 to 5
이전 답변에서 논의된 다양한 접근 방식은 사용자가 삭제할 열 인덱스를 알고 있거나 사용자가 열 범위(예: 'C' : 'E' ).
pandas.DataFrame.drop() 은 확실히 사용자가 정의한 열 목록을 기반으로 데이터를 부분 집합화하는 옵션입니다(하지만 항상 데이터 프레임의 복사본을 사용하고 inplace 매개변수를 True 로 설정해서는 안 된다는 점에 주의해야 합니다!!)
또 다른 옵션은 pandas.columns.difference() 를 사용하는 것입니다. 이는 열 이름에 대해 차이를 설정하고 원하는 열이 포함된 배열의 인덱스 유형을 반환합니다. 다음은 솔루션입니다.
df = pd.DataFrame([[2,3,4], [3,4,5]], columns=['a','b','c'], index=[1,2]) columns_for_differencing = ['a'] df1 = df.copy()[df.columns.difference(columns_for_differencing)] print(df1)
출력은 다음과 같습니다.
bc 1 3 4 2 4 5
pandas.DataFrame.get
사용해 보십시오( 문서 참조).
import pandas as pd import numpy as np dates = pd.date_range('20200102', periods=6) df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD')) df.get(['A', 'C'])
df.pop() 을 사용할 수도 있습니다.
>>> df = pd.DataFrame([('falcon', 'bird', 389.0), ... ('parrot', 'bird', 24.0), ... ('lion', 'mammal', 80.5), ... ('monkey', 'mammal', np.nan)], ... columns=('name', 'class', 'max_speed')) >>> df name class max_speed 0 falcon bird 389.0 1 parrot bird 24.0 2 lion mammal 80.5 3 monkey mammal >>> df.pop('class') 0 bird 1 bird 2 mammal 3 mammal Name: class, dtype: object >>> df name max_speed 0 falcon 389.0 1 parrot 24.0 2 lion 80.5 3 monkey NaN
df.pop(c)
사용하십시오.
여러 열을 선택하려면 추출하고 그 이후에 봅니다. df
는 이전에 데이터 프레임으로 이름이 지정되었으며 새 데이터 프레임 df1
만들고 추출하고 볼 열 A에서 D를 선택합니다.
df1 = pd.DataFrame(data_frame, columns=['Column A', 'Column B', 'Column C', 'Column D']) df1
모든 필수 열이 표시됩니다!
나는 그것에 대한 몇 가지 답변을 보았지만 하나는 나에게 불분명했습니다. 관심 있는 열을 어떻게 선택하시겠습니까?
이에 대한 대답은 목록으로 수집한 경우 목록을 사용하여 열을 참조할 수 있다는 것입니다.
print(extracted_features.shape) print(extracted_features) (63,) ['f000004' 'f000005' 'f000006' 'f000014' 'f000039' 'f000040' 'f000043' 'f000047' 'f000048' 'f000049' 'f000050' 'f000051' 'f000052' 'f000053' 'f000054' 'f000055' 'f000056' 'f000057' 'f000058' 'f000059' 'f000060' 'f000061' 'f000062' 'f000063' 'f000064' 'f000065' 'f000066' 'f000067' 'f000068' 'f000069' 'f000070' 'f000071' 'f000072' 'f000073' 'f000074' 'f000075' 'f000076' 'f000077' 'f000078' 'f000079' 'f000080' 'f000081' 'f000082' 'f000083' 'f000084' 'f000085' 'f000086' 'f000087' 'f000088' 'f000089' 'f000090' 'f000091' 'f000092' 'f000093' 'f000094' 'f000095' 'f000096' 'f000097' 'f000098' 'f000099' 'f000100' 'f000101' 'f000103']
63개의 열을 지정하는 다음 list/NumPy 배열 extracted_features
원래 데이터 세트에는 103개의 열이 있으며 정확히 그 열을 추출하고 싶습니다.
dataset[extracted_features]
그리고 당신은 이것으로 끝날 것입니다
이것은 기계 학습 (더 구체적으로, 기능 선택)에서 꽤 자주 사용하는 것입니다. 다른 방법도 논의하고 싶지만 이미 다른 스택 오버플로 사용자가 다루었다고 생각합니다.
def get_slize(dataframe, start_row, end_row, start_col, end_col): assert len(dataframe) > end_row and start_row >= 0 assert len(dataframe.columns) > end_col and start_col >= 0 list_of_indexes = list(dataframe.columns)[start_col:end_col] ans = dataframe.iloc[start_row:end_row][list_of_indexes] return ans
이 기능만 사용하세요
일부 열을 제외하려면 열 인덱스에 삭제할 수 있습니다. 예를 들어:
ABCD 0 1 10 100 1000 1 2 20 200 2000
다음을 제외한 모든 열 선택:
df[df.columns.drop('C')]
산출:
ABD 0 1 10 1000 1 2 20 2000
2개를 제외한 모두 선택:
df[df.columns.drop(['B', 'D'])]
산출:
AC 0 1 100 1 2 200
출처 : http:www.stackoverflow.com/questions/11285613/selecting-multiple-columns-in-a-pandas-dataframe
데이터베이스의 모든 테이블 크기 가져오기 (0) | 2022.03.07 |
---|---|
여러 커밋을 다른 분기에 단일 스쿼시 커밋으로 병합하려면 어떻게 해야 합니까? (0) | 2022.03.07 |
match_parent와 fill_parent의 차이점은 무엇입니까? (0) | 2022.03.07 |
JavaScript에서 날짜 형식 지정에 대한 문서는 어디에서 찾을 수 있습니까? (0) | 2022.03.07 |
목록 이해로 사전 만들기 (0) | 2022.03.04 |