2017-10-05 51 views
0

我想將DataFrame中的列的值分配給同一原始DataFrame中另一列的子集。請看下面的例子:Pandas DataFrame:將列中的值分配給原始數據框的子集而不復制

df = pd.DataFrame(np.random.randn(8, 4), index=[0,1,1,2,1,3,4,5], columns=['A', 'B', 'C', 'D']) 
df['str'] = ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'] 
df.loc[1, 'B'] = df.loc[1, 'A'] 

對於其中的索引是1所有值,我想'A'列的值賦給'B'列。此操作將應用於原始DataFrame而不是副本。

上面的例子失敗,出現以下錯誤

ValueError        Traceback (most recent call last) 
<ipython-input-144-29c8017817b2> in <module>() 
     2 df['str'] = ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'] 
     3 display(df) 
----> 4 df.loc[1, 'B'] = df.loc[1, 'A'] 
     5 display(df) 

~/anaconda/envs/snakes36/lib/python3.6/site-packages/pandas/core/indexing.py in __setitem__(self, key, value) 
    177    key = com._apply_if_callable(key, self.obj) 
    178   indexer = self._get_setitem_indexer(key) 
--> 179   self._setitem_with_indexer(indexer, value) 
    180 
    181  def _has_valid_type(self, k, axis): 

~/anaconda/envs/snakes36/lib/python3.6/site-packages/pandas/core/indexing.py in _setitem_with_indexer(self, indexer, value) 
    577 
    578      if len(labels) != len(value): 
--> 579       raise ValueError('Must have equal len keys and value ' 
    580           'when setting with an iterable') 
    581 

ValueError: Must have equal len keys and value when setting with an iterable 

這個問題似乎是柱str是不同類型比其它float64列。如果我刪除列str,上面的代碼完美工作。我不明白,因爲我假設我的.loc操作只選擇列AB

問題是:我的DataFrame包含~50列不同類型。

有沒有更好的方法來解決這個問題?

+0

難道我的回答幫助? – Dark

回答

1

選項1: 使用條件相匹配的索引即

df.loc[df.index==1,'B'] =df.loc[1,'A'] 

選項2:np.where

df['B'] = np.where(df['B'].index==1,df['A'],df['B']) 

選項3: 或與df.where

df['B'] = df['B'].where(~(df['B'].index==1),df['A']) 

輸出:

 
      A   B   C   D str 
0 -0.549047 -0.608938 -0.355242 1.362221 a 
1 0.298822 0.298822 1.591475 0.146636 a 
1 -0.292439 -0.292439 0.425860 0.117091 a 
2 -1.715484 -0.343491 -1.448902 1.394756 a 
1 0.657651 0.657651 -0.002407 1.317446 a 
3 -0.698070 -0.740400 -1.348418 -0.800586 a 
4 -1.043036 -0.161858 1.110410 0.275207 a 
5 0.050947 -1.424375 0.260261 -1.058468 a 
+1

'df.loc [df.index == 1,'B'] = df.loc [1,'A']'也會。 – Zero

+0

謝謝先生。我更新了 – Dark

+0

謝謝!由於我需要在許多大型DataFrame上執行類似的操作,所有選項的效率是否相似? –

相關問題