2016-04-29 30 views
5

Tôi có giai đoạn cột dataframe có giá trị theo Quarters (Q1, Q2, Q3, Q4) mà tôi muốn chuyển đổi thành tháng được liên kết (xem dict). Mã của tôi dưới đây hoạt động tuy nhiên tự hỏi tại sao tôi nhận được cảnh báo này.Giá trị được cố gắng đặt trên bản sao của một lát từ Khung dữ liệu

Giá trị đang cố gắng được đặt trên bản sao của một lát từ khung dữ liệu. Hãy thử sử dụng .loc [row_indexer, col_indexer] = giá trị thay vì

quarter = {"Q1":"Mar","Q2":"Jun","Q3":"Sep","Q4":"Dec"} 
df['period'] = df['period'].astype(str).map(quarter) 

Trả lời

5

"Một giá trị đang cố gắng để được đặt trên một bản sao của một lát từ một DataFrame" là một cảnh báo. SO chứa nhiều bài viết về chủ đề này.

df.assign đã được thêm vào Pandas 0,16 và là cách hay để tránh cảnh báo này.

quarter = {"Q1": "Mar", "Q2": "Jun", "Q3": "Sep", "Q4": "Dec"} 
df = pd.DataFrame({'period': ['Q1', 'Q2', 'Q3', 'Q4', 'Q5'], 'qtr': [1, 2, 3, 4, 5]}) 

df 
    period qtr 
0  Q1 1 
1  Q2 2 
2  Q3 3 
3  Q4 4 
4  Q5 5 

df = df.assign(period=[quarter.get(q, q) for q in df.period]) 

# Unmapped values unchanged. 
>>> df 
    period qtr 
0 Mar 1 
1 Jun 2 
2 Sep 3 
3 Dec 4 
4  Q5 5 

df = pd.DataFrame({'period': ['Q1', 'Q2', 'Q3', 'Q4', 'Q5'], 'qtr': [1, 2, 3, 4, 5]}) 
df = df.assign(period=df.period.map(quarter)) 

# Unmapped values get `NaN`. 
>>> df 
    period qtr 
0 Mar 1 
1 Jun 2 
2 Sep 3 
3 Dec 4 
4 NaN 5 

Gán cột mới vào một DataFrame, trở về một đối tượng mới (bản sao) với tất cả các cột gốc, thêm vào những cái mới.

.. versionadded :: 0.16.0

+0

Tôi nghĩ rằng trong các phiên bản trước đó cảnh báo được hiển thị không đúng cách đôi khi. Tôi không nhận được cảnh báo trong gấu trúc 0,18.0. Nhưng tốt để tìm hiểu về chỉ định. – ayhan

Các vấn đề liên quan