판다 데이터 프레임에서 행의 하위 집합 수정
A와 B라는 두 개의 열이 있는 판다 데이터 프레임을 가지고 있다고 가정합니다.A가 0일 때마다 B가 항상 NaN이 되도록 이 DataFrame을 수정(또는 복사본을 생성)하고 싶습니다.제가 어떻게 그것을 달성할 수 있을까요?
저는 다음을 시도했습니다.
df['A'==0]['B'] = np.nan
그리고.
df['A'==0]['B'].values.fill(np.nan)
성공하지 못한
레이블 기반 인덱싱에 사용:
df.loc[df.A==0, 'B'] = np.nan
그df.A==0
식은 행을 인덱싱하는 부울 열을 만듭니다.'B'
열을 선택합니다.이를 사용하여 열의 하위 집합을 변환할 수도 있습니다. 예를 들어, 다음과 같습니다.
df.loc[df.A==0, 'B'] = df.loc[df.A==0, 'B'] / 2
판다 내부에 대해서는 정확히 왜 그런지 알 수 없지만, 기본적인 문제는 데이터 프레임에 인덱싱하면 결과의 복사본이 반환되고, 때로는 원래 개체에 대한 뷰가 반환된다는 것입니다.여기 문서에 따르면 이 동작은 기본적인 마비 동작에 따라 달라집니다.[하나][둘]이 아닌 한 번의 작업으로 모든 것에 액세스하는 것이 설정에 더 효과적이라는 것을 알게 되었습니다.
다음은 고급 인덱싱에 대한 판다 문서입니다.
그 섹션은 당신이 무엇을 필요로 하는지 정확히 설명해 줄 것입니다!알고 보니df.loc
(아래에서 많은 사람들이 지적했듯이 .ix는 더 이상 사용되지 않습니다.) 데이터 프레임의 쿨 슬라이싱/다이싱에 사용할 수 있습니다.그리고. 세팅도 할 수 있고요.
df.loc[selection criteria, columns I want] = value
그래서 브렌의 대답은 '나를 찾는 모든 장소들을 찾는 것입니다.df.A == 0
열 선택B
으로 설정합니다.np.nan
'
판다에서 시작하는 0.20 ix는 더 이상 사용되지 않습니다.올바른 방법은 df.loc를 사용하는 것입니다.
여기 작동하는 예가 있습니다.
>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
>>>
설명:
여기 문서에서 설명한 바와 같이,.loc
주로 레이블 기반이지만 부울 배열과 함께 사용할 수도 있습니다.
그래서, 우리가 위에서 하는 것은 적용하는 것입니다.df.loc[row_index, column_index]
기준:
- 이 사실을 이용하여
loc
Panda에게 변경할 행의 하위 집합을 알려주는 마스크로 부울 배열을 사용할 수 있습니다.row_index
- 사실 활용
loc
또한 레이블을 사용하여 열을 선택하는 레이블입니다.'B'
에서column_index
우리는 논리적, 조건 또는 일련의 불리언을 반환하는 모든 연산을 사용하여 불리언 배열을 구성할 수 있습니다.위의 예에서, 우리는 원하는 것이 있습니다.rows
를 포함하는0
우리가 사용할 수 있는 것.df.A == 0
아래의 예에서 볼 수 있듯이, 이것은 일련의 부울을 반환합니다.
>>> df = pd.DataFrame({"A":[0,1,0], "B":[2,0,5]}, columns=list('AB'))
>>> df
A B
0 0 2
1 1 0
2 0 5
>>> df.A == 0
0 True
1 False
2 True
Name: A, dtype: bool
>>>
그런 다음 위의 불리언 배열을 사용하여 필요한 행을 선택하고 수정합니다.
>>> df.loc[df.A == 0, 'B'] = np.nan
>>> df
A B
0 0 NaN
1 1 0
2 0 NaN
자세한 내용은 여기에서 고급 인덱싱 설명서를 참조하십시오.
속도를 크게 높이려면 NumPy's where 기능을 사용합니다.
세우다
0이 있는 100,000개의 행으로 구성된 2열 데이터 프레임을 만듭니다.
df = pd.DataFrame(np.random.randint(0,3, (100000,2)), columns=list('ab'))
솔션루른으로 빠른 numpy.where
df['b'] = np.where(df.a.values == 0, np.nan, df.b.values)
타이밍
%timeit df['b'] = np.where(df.a.values == 0, np.nan, df.b.values)
685 µs ± 6.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.loc[df['a'] == 0, 'b'] = np.nan
3.11 ms ± 17.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
s 눔피의의where
빠름 » 4배 더 빠름 »
다열을바는방다법은음사배을다열변로환니합여를 사용하여 합니다..values
:
df.loc[df.A==0, ['B', 'C']] = df.loc[df.A==0, ['B', 'C']].values / 2
대안:
제가 보기에는 1번이 가장 좋아 보이지만, 이상하게도 저는 그것에 대한 증명 서류를 찾을 수 없습니다.
- 열을 열로 필터링(참고: 필터는 열이 기록되는 다음에 오는 것이지 이전이 아님)
dataframe.column[필터 조건]= 변경할 값
df.B[df.A==0] = np.nan
dataframe.loc[필터 조건, 변경할 열]=변경할 값
df.loc[df.A == 0, 'B'] = np.nan
dataframe.column=np.where(필터 조건, 참인 경우 값, 거짓인 경우 값)
import numpy as np
df.B = np.where(df.A== 0, np.nan, df.B)
dataframe.column=df.value(열: 조건이 true이면 값, 거짓이면 행이 아닌 행 사용)
df.B = df.apply(lambda x: np.nan if x['A']==0 else x['B'],axis=1)
- zip 및 목록 구문
dataframe.column=[조건이 true인 경우 value, 열 a 및 b의 zip 함수에서 요소 a, b 목록에 대해 false인 경우 value]
df.B = [np.nan if a==0 else b for a,b in zip(df.A,df.B)]
하려면 Pandas 서데이프레통수을임정다면 "음적설탕사" "자를사수할"와 같은 "통사 할 수 .+=
,*=
,/=
타기. 그래서 대신:
df.loc[df.A == 0, 'B'] = df.loc[df.A == 0, 'B'] / 2
다음과 같이 쓸 수 있습니다.
df.loc[df.A == 0, 'B'] /= 2
을 값다 로대방법는으로 NaN
Pandas 방법을 사용할 수 있습니다. 예:
df = pd.DataFrame({'A': [1, 2, 3], 'B': [0, 0, 4]})
A B
0 1 0
1 2 0
2 3 4
df['A'].mask(df['B'] == 0, inplace=True) # other=np.nan by default
# df['A'].where(df['B'] != 0, inplace=True)
결과:
A B
0 NaN 0
1 NaN 0
2 3.0 4
언급URL : https://stackoverflow.com/questions/12307099/modifying-a-subset-of-rows-in-a-pandas-dataframe
'programing' 카테고리의 다른 글
iOS에서 프로그래밍 방식으로 절전 모드를 비활성화/활성화하는 방법은 무엇입니까? (0) | 2023.06.19 |
---|---|
CSV 플랫 파일로 데이터를 내보내는 동안 포함된 텍스트 한정자 문제를 해결하는 방법은 무엇입니까? (0) | 2023.06.19 |
원격 풀 중에 모든 태그를 가져오도록 Git 기본값을 설정할 수 있습니까? (0) | 2023.06.19 |
SQL, 보조 숫자 표 (0) | 2023.06.19 |
'charmap' 코덱은 위치 0에서 문자 '\u010c'를 인코딩할 수 없습니다. 문자 맵은 MariaDB 및 SQLChemy에 있습니다. (0) | 2023.06.19 |