Thay thế các giá trị cột trong DataFrame của gấu trúc


141

Tôi đang cố gắng thay thế các giá trị trong một cột của khung dữ liệu. Cột ('nữ') chỉ chứa các giá trị 'nữ' và 'nam'.

Tôi đã thử như sau:

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

Nhưng nhận được bản sao chính xác của các kết quả trước đó.

Tôi lý tưởng muốn có được một số đầu ra giống như phần tử vòng lặp sau đây.

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

Tôi đã xem qua tài liệu gotchas ( http://pandas.pydata.org/pandas-docs/ sóng / gotchas.html ) nhưng không thể hiểu tại sao không có gì xảy ra.

Bất kỳ trợ giúp sẽ được đánh giá cao.

Câu trả lời:


259

Nếu tôi hiểu đúng, bạn muốn một cái gì đó như thế này:

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

(Ở đây tôi chuyển đổi các giá trị thành số thay vì chuỗi chứa số. Bạn có thể chuyển đổi chúng thành "1""0", nếu bạn thực sự muốn, nhưng tôi không chắc tại sao bạn muốn điều đó.)

Lý do mã của bạn không hoạt động là vì sử dụng ['female']trên một cột (thứ hai 'female'trong của bạn w['female']['female']) không có nghĩa là "chọn các hàng trong đó giá trị là 'nữ'". Điều này có nghĩa là chọn các hàng trong đó chỉ mục là 'nữ', trong đó có thể không có bất kỳ hàng nào trong Khung dữ liệu của bạn.


6
Cảm ơn. Chính xác những gì tôi đang tìm kiếm. Nếu tôi định ánh xạ 'nữ' thành 1 và bất cứ điều gì khác thành '0'. Làm thế nào mà làm việc?
Đen

17
chỉ sử dụng điều này, nếu tất cả các giá trị trong cột được đưa ra trong hàm ánh xạ. Các giá trị không được chỉ định trong hàm ánh xạ sẽ được thay thế bằng nan.
Chandra

1
Tôi cũng khuyên bạn nên sử dụng .loccú pháp để tránh SettingWithCopyWarning: pandas.pydata.org/pandas-docs/urdy/ mẹo
NickBraunagel

2
thay vì .map tôi đã sử dụng .replace
JS noob

Làm thế nào để tôi thoát khỏi '.' trong số hàng ngàn trên hai hoặc nhiều cột, không thể tìm ra. cảm ơn bạn rất nhiều
M.

115

Bạn có thể chỉnh sửa một tập hợp con của khung dữ liệu bằng cách sử dụng loc:

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

Trong trường hợp này:

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

1
Làm cách nào để điều chỉnh nó để tôi không cần chọn các hàng cụ thể thông qua một điều kiện, chỉ tất cả các hàng trong một cột cụ thể? Vì vậy, thay đổi tất cả các ô trong một cột thành một giá trị cụ thể.
Dhruv Ghulati

3
@DhruvGhulati, bạn sẽ sử dụng df.loc [:, <chọn cột>]


38

Biến thể nhẹ:

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

19

Điều này cũng sẽ làm việc:

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

11

Bạn cũng có thể sử dụng applyvới .gettức là

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

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

Khung dữ liệu w:

   female
0  female
1    male
2  female

Sử dụng applyđể thay thế các giá trị từ từ điển:

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

Kết quả:

   female
0       1
1       0
2       1 

Lưu ý: apply với từ điển nên được sử dụng nếu tất cả các giá trị có thể có của các cột trong khung dữ liệu được xác định trong từ điển khác, nó sẽ trống đối với các giá trị không được xác định trong từ điển.


8

Cái này rất nhỏ gọn:

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

Một số tốt khác:

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

Ví dụ đầu tiên là lập chỉ mục chuỗi và được cảnh báo chống lại vì nó không thể đảm bảo liệu df kết quả là bản sao hay chế độ xem. Xem lập chỉ mục chuỗi
Nordle

7

Ngoài ra, có chức năng tích hợp pd.get_dummies cho các loại bài tập này:

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

Điều này cung cấp cho bạn một khung dữ liệu có hai cột, một cột cho mỗi giá trị xảy ra trong w ['nữ'], trong đó bạn thả cái đầu tiên (vì bạn có thể suy ra nó từ cái còn lại). Cột mới được tự động đặt tên là chuỗi mà bạn đã thay thế.

Điều này đặc biệt hữu ích nếu bạn có các biến phân loại có nhiều hơn hai giá trị có thể. Hàm này tạo ra càng nhiều biến giả cần thiết để phân biệt giữa tất cả các trường hợp. Hãy cẩn thận khi bạn không gán toàn bộ khung dữ liệu cho một cột, nhưng thay vào đó, nếu w ['nữ'] có thể là 'nam', 'nữ' hoặc 'trung lập', hãy làm như thế này:

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

Sau đó, bạn còn lại hai cột mới cung cấp cho bạn mã hóa giả là 'nữ' và bạn đã thoát khỏi cột bằng các chuỗi.


4

Sử dụng Series.mapvớiSeries.fillna

Nếu cột của bạn chứa nhiều chuỗi hơn chỉ femalemale, Series.mapsẽ thất bại trong trường hợp này vì nó sẽ trả về NaNcác giá trị khác.

Đó là lý do tại sao chúng ta phải xâu chuỗi nó với fillna:

Ví dụ tại sao .mapthất bại :

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

Cho đúng phương pháp, chúng tôi chuỗi mapvới fillna, vì vậy chúng tôi lấp đầy NaNvới các giá trị từ cột gốc:

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

Ngoài ra còn có một chức năng pandasđược gọi factorizemà bạn có thể sử dụng để tự động thực hiện loại công việc này. Nó chuyển đổi nhãn thành số : ['male', 'female', 'male'] -> [0, 1, 0]. Xem câu trả lời này để biết thêm thông tin.


0

Tôi nghĩ rằng trong câu trả lời nên được chỉ ra loại đối tượng nào bạn nhận được trong tất cả các phương thức được đề xuất ở trên: đó là Sê-ri hoặc Khung dữ liệu.

Khi bạn nhận được cột theo w.female.hoặc w[[2]](trong đó, giả sử, 2 là số cột của bạn), bạn sẽ nhận lại DataFrame. Vì vậy, trong trường hợp này bạn có thể sử dụng các phương thức DataFrame như thế nào .replace.

Khi bạn sử dụng .lochoặc ilocbạn lấy lại Sê-ri và Sê-ri không có .replacephương thức, vì vậy bạn nên sử dụng các phương thức như apply, mapv.v.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.