programing

판다 데이터 프레임에서 행의 하위 집합 수정

showcode 2023. 6. 19. 21:48
반응형

판다 데이터 프레임에서 행의 하위 집합 수정

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]기준:

  • 이 사실을 이용하여locPanda에게 변경할 행의 하위 집합을 알려주는 마스크로 부울 배열을 사용할 수 있습니다.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번이 가장 좋아 보이지만, 이상하게도 저는 그것에 대한 증명 서류를 찾을 수 없습니다.

  1. 열을 열로 필터링(참고: 필터는 열이 기록되는 다음에 오는 것이지 이전이 아님)

dataframe.column[필터 조건]= 변경할 값

df.B[df.A==0] = np.nan
  1. loc

dataframe.loc[필터 조건, 변경할 열]=변경할 값

df.loc[df.A == 0, 'B'] = np.nan
  1. 어디가 어질어질한.

dataframe.column=np.where(필터 조건, 참인 경우 값, 거짓인 경우 값)

import numpy as np
df.B = np.where(df.A== 0, np.nan, df.B)
  1. 람다 적용

dataframe.column=df.value(열: 조건이 true이면 값, 거짓이면 행이 아닌 행 사용)

df.B = df.apply(lambda x: np.nan if x['A']==0 else x['B'],axis=1)
  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

을 값다 로대방법는으로 NaNPandas 방법을 사용할 수 있습니다. 예:

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

반응형