2015-09-20 35 views
12

Đây là câu hỏi rất cơ bản, tôi dường như không thể tìm thấy câu trả lời.Sao chép tất cả giá trị trong một cột vào cột mới trong khung dữ liệu gấu trúc

Tôi có một dataframe như thế này, được gọi là df:

A  B  C 
a.1 b.1 c.1 
a.2 b.2 c.2 
a.3 b.3 c.3 

Sau đó, tôi trích xuất tất cả các hàng từ df, nơi cột 'B' có một giá trị của 'b.2'. Tôi chỉ định các kết quả này cho df_2.

df_2 = df[df['B'] == 'b.2'] 

df_2 trở thành:

A  B  C 
a.2 b.2 c.2 

Sau đó, tôi sao chép tất cả các giá trị trong cột 'B' cho một cột mới có tên 'D'. Gây df_2 để trở thành:

A  B  C  D 
a.2 b.2 c.2 b.2 

Khi tôi phôi chuyển nhượng như thế này:

df_2['D'] = df_2['B'] 

tôi nhận được cảnh báo sau đây:

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

Xem những hãy cẩn thận trong tài liệu: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy


Tôi cũng đã cố gắng sử dụng .loc khi tạo df_2 như thế này:

df_2 = df.loc[df['B'] == 'b.2'] 

Tuy nhiên, tôi vẫn nhận được cảnh báo.

Bất kỳ trợ giúp nào được đánh giá cao.

+0

gì 'phương tiện a.1'? Nó là một chuỗi? –

Trả lời

22

Bạn chỉ có thể gán B đến cột mới, Like -

df['D'] = df['B'] 

Ví dụ/Demo -

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([['a.1','b.1','c.1'],['a.2','b.2','c.2'],['a.3','b.3','c.3']],columns=['A','B','C']) 

In [3]: df 
Out[3]: 
    A B C 
0 a.1 b.1 c.1 
1 a.2 b.2 c.2 
2 a.3 b.3 c.3 

In [4]: df['D'] = df['B']     #<---What you want. 

In [5]: df 
Out[5]: 
    A B C D 
0 a.1 b.1 c.1 b.1 
1 a.2 b.2 c.2 b.2 
2 a.3 b.3 c.3 b.3 

In [6]: df.loc[0,'D'] = 'd.1' 

In [7]: df 
Out[7]: 
    A B C D 
0 a.1 b.1 c.1 d.1 
1 a.2 b.2 c.2 b.2 
2 a.3 b.3 c.3 b.3 
+0

Bạn đã sử dụng 'df ['D'] = df ['B'] phải không? Bạn không nên có được điều đó, bạn đã làm điều gì khác? –

+3

Cảm ơn bạn! Tôi nhận được: Giá trị đang cố gắng được đặt trên bản sao của một lát từ một DataFrame. Thử sử dụng.loc [row_indexer, col_indexer] = value thay vì Xem các lưu ý trong tài liệu: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df [' D '] = df [' B '] Sẽ tốt hơn nếu lặp lại qua mỗi hàng kéo giá trị và gán nó vào cột mới? Hay đây không phải là vấn đề? –

+0

Như tôi đã nói, bạn đã sử dụng 'df ['D'] = df ['B']'? Nếu bạn không sử dụng cái gì khác? –

11

Vấn đề là trong dòng trước khi một trong đó ném cảnh báo. Khi bạn tạo df_2 đó là nơi bạn đang tạo một bản sao của một lát của một khung dữ liệu. Thay vào đó, khi bạn tạo df_2, sử dụng .copy() và bạn sẽ không nhận được cảnh báo đó sau này.

df_2 = df[df['B'] == 'b.2'].copy() 
+0

Điều đó đã khắc phục được! Cảm ơn bạn –

+0

chính xác những gì .copy() làm khác nhau ở đây? –

+0

Sự khác biệt với .copy() là nó trả về một đối tượng mới thay vì một khung nhìn của đối tượng gốc. Vì vậy, nếu bạn thay đổi đối tượng mới, đối tượng gốc sẽ không bị thay đổi. – Alex

1

Tôi nghĩ rằng phương pháp truy cập chính xác được sử dụng chỉ số:

df_2.loc[:,'D'] = df_2['B'] 
+1

Nó sẽ tăng "SettingWithCopyWarning" –

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