pandas DataFrame에서 열 값 바꾸기


141

데이터 프레임의 한 열에있는 값을 바꾸려고합니다. 열 ( 'female')에는 'female'및 'male'값만 포함됩니다.

나는 다음을 시도했다.

w['female']['female']='1'
w['female']['male']='0' 

그러나 이전 결과와 동일한 사본을받습니다.

이상적으로 다음과 같은 루프와 비슷한 출력을 얻고 싶습니다.

if w['female'] =='female':
    w['female'] = '1';
else:
    w['female'] = '0';

gotchas 문서 ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html )를 살펴 보았지만 아무런 일이 발생하지 않는 이유를 알 수 없습니다.

도움을 주시면 감사하겠습니다.

답변:


259

내가 올바르게 이해하면 다음과 같은 것을 원합니다.

w['female'] = w['female'].map({'female': 1, 'male': 0})

(여기서 숫자를 포함하는 문자열 대신 값을 숫자로 변환합니다. 원하는 경우 "1"and 로 변환 할 수 "0"있지만 왜 원하는지 잘 모르겠습니다.)

사용하기 때문에 코드가 작동하지 않는 이유는 ['female']컬럼에 (두 번째 'female'당신의가 w['female']['female']) 없습니다 평균 "값이 '여성'인 행을 선택"을 수행합니다. 그것은 인덱스 가 '여성'인 행을 선택하는 것을 의미하며 , 그 중 DataFrame에는 없을 수 있습니다.


6
감사. 정확히 내가 찾던 것. '여성'을 1에 매핑하고 다른 것을 '0'에 매핑하려면. 어떻게 작동할까요?
Black

17
열의 모든 값이 map 함수에 제공되는 경우에만 사용하십시오. map 함수에 지정되지 않은 열 값은 nan으로 대체됩니다.
찬드라

1
또한 다음 .loc과 같은 구문을 피하는 것이 좋습니다 SettingWithCopyWarning. pandas.pydata.org/pandas-docs/stable/…
NickBraunagel

2
.map 대신 .replace를 사용했습니다.
JS noob

'.'를 제거하려면 어떻게합니까? 둘 이상의 열에있는 수천 개 중 하나를 알아낼 수 없습니다. 대단히 감사합니다
M. Mariscal

115

loc을 사용하여 데이터 프레임의 서브 세트를 편집 할 수 있습니다.

df.loc[<row selection>, <column selection>]

이 경우 :

w.loc[w.female != 'female', 'female'] = 0
w.loc[w.female == 'female', 'female'] = 1

1
조건을 통해 특정 행을 선택할 필요가 없으며 특정 열의 모든 행만 선택하면 어떻게 적용합니까? 따라서 열의 모든 셀을 특정 값으로 변경하십시오.
Dhruv Ghulati

3
@DhruvGhulati, 당신은 df.loc [:, <column selection>]을 사용합니다


38

약간의 변형 :

w.female.replace(['male', 'female'], [1, 0], inplace=True)

19

이것은 또한 작동해야합니다 :

w.female[w.female == 'female'] = 1 
w.female[w.female == 'male']   = 0

11

당신은 또한 사용할 수 있습니다 apply.get즉,

w['female'] = w['female'].apply({'male':0, 'female':1}.get):

w = pd.DataFrame({'female':['female','male','female']})
print(w)

데이터 프레임 w:

   female
0  female
1    male
2  female

apply사전에서 값을 바꾸는 데 사용 :

w['female'] = w['female'].apply({'male':0, 'female':1}.get)
print(w)

결과:

   female
0       1
1       0
2       1 

참고 : apply 데이터 프레임에서 가능한 모든 열 값이 사전에 정의되어있는 경우 사전을 사용해야합니다. 사전에 정의되지 않은 값은 비어 있습니다.


8

이것은 매우 컴팩트합니다.

w['female'][w['female'] == 'female']=1
w['female'][w['female'] == 'male']=0

또 다른 좋은 것 :

w['female'] = w['female'].replace(regex='female', value=1)
w['female'] = w['female'].replace(regex='male', value=0)

첫 번째 예는 체인 인덱싱이며 결과 df가 사본인지 또는 뷰인지를 보증 할 수 없으므로 경고됩니다. 참조 체인 인덱싱
Nordle

7

또는 이러한 종류의 할당을위한 내장 함수 pd.get_dummies가 있습니다.

w['female'] = pd.get_dummies(w['female'],drop_first = True)

이것은 w [ 'female']에서 발생하는 각 값에 대해 하나씩 두 개의 열이있는 데이터 프레임을 제공합니다.이 열 중 첫 번째는 삭제합니다 (왼쪽에서 추론 할 수 있기 때문에). 새 열의 이름은 교체 한 문자열로 자동 지정됩니다.

이것은 둘 이상의 가능한 값을 가진 범주 형 변수가있는 경우 특히 유용합니다. 이 함수는 모든 경우를 구별하는 데 필요한 많은 더미 변수를 만듭니다. 전체 데이터 프레임을 단일 열에 할당하지 말고 w [ 'female']이 'male', 'female'또는 'neutral'일 수있는 경우 다음과 같이하십시오.

w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1])
w.drop('female', axis = 1, inplace = True)

그런 다음 두 개의 새로운 열이 남아 '여성'의 더미 코딩을 제공하고 문자열이있는 열을 제거했습니다.


4

사용 Series.map함께Series.fillna

당신의 열은보다 더 많은 문자열을 포함하는 경우 femalemale, Series.map그것을 반환하기 때문에이 경우에 실패합니다NaN 다른 값.

그래서 우리는 그것을 연결해야합니다 fillna .

.map실패한 예 :

df = pd.DataFrame({'female':['male', 'female', 'female', 'male', 'other', 'other']})

   female
0    male
1  female
2  female
3    male
4   other
5   other
df['female'].map({'female': '1', 'male': '0'})

0      0
1      1
2      1
3      0
4    NaN
5    NaN
Name: female, dtype: object

올바른 방법을 위해로 체인 map을 연결 하여 원래 열의 값으로를 fillna채 웁니다 NaN.

df['female'].map({'female': '1', 'male': '0'}).fillna(df['female'])

0        0
1        1
2        1
3        0
4    other
5    other
Name: female, dtype: object

2

이 유형의 작업을 자동으로 수행하는 데 사용할 수 있는 pandas호출 기능도 factorize있습니다. 라벨을 숫자로 변환합니다 : ['male', 'female', 'male'] -> [0, 1, 0]. 자세한 내용은 답변을 참조하십시오.


0

나는 위에서 제안한 모든 방법에서 어떤 유형의 객체를 얻었는지 대답해야한다고 생각합니다.

w.female.또는로 열을 가져 오면 w[[2]](2는 열의 수라고 가정) DataFrame을 다시 가져옵니다. 따라서이 경우와 같은 DataFrame 메서드를 사용할 수 있습니다 .replace.

당신이 사용하는 경우 .loc또는 iloc당신이 시리즈를 다시 얻고, 시리즈는없는 .replace당신 같은 방법을 사용해야하므로, 방법 apply, map등등을.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.