2015-09-20 48 views
12

這是一個非常基本的問題,我似乎無法找到答案。將一列中的所有值複製到熊貓數據框中的新列中

我有一個這樣的數據幀,稱爲DF:

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

然後我提取所有從DF,其中列「B」具有「B.2」的值的行。我將這些結果分配給df_2。

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

df_2變爲:

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

然後,我在列 'B' 拷貝所有的值到一個名爲 'd' 新列。造成df_2成爲:

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

當我瓶坯像這樣的任務:

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

我得到以下警告:

值要試圖在副本集來自DataFrame的切片。 http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy


我也喜歡這個創建df_2時使用的.loc嘗試:使用的.loc [row_indexer,col_indexer] =值,而不是

查看文檔中的告誡嘗試

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

但是,我仍然收到警告。

任何幫助,非常感謝。

+0

這是什麼'a.1'手段?它是一個字符串嗎? –

回答

22

你可以簡單地分配B到新列,就像 -

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

示例/演示 -

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

您使用過'df ['D'] = df ['B']對不對?你不應該那樣做,你做了別的事嗎? –

+3

謝謝!我得到: 正嘗試在DataFrame的切片副本上設置一個值。 嘗試使用。loc [row_indexer,col_indexer] =值代替 請參閱文檔中的注意事項:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy df [' D'] = df ['B'] 迭代每一行並將其分配給新列會更好嗎?或者這是一個非問題? –

+0

就像我說的,你使用過'df ['D'] = df ['B']'?如果不是你還用了什麼? –

11

的問題是在該行拋出了一個前警告。當您創建df_2時,您就是要創建數據幀片段的副本。相反,當您創建df_2時,請使用.copy(),稍後您將不會得到該警告。

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

修復了它!謝謝 –

+0

.copy()在這裏有什麼不同? –

+0

與.copy()的區別在於它返回一個新對象,而不是原始對象的視圖。所以如果你改變新的物體,原來的物體將不會被改變。 – Alex

1

我認爲正確的訪問方法是使用索引:

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

它會引發「SettingWithCopyWarning」 –

相關問題