2017-10-05 9 views
0

DataFrameの列の値を、同じオリジナルのDataFrame内の別の列のサブセットに割り当てたいとします。次の例を考えてみましょう:インデックスが1あるすべての値について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'] 

、私は列'B'に列'A'の値を割り当てます。この操作は元の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 

で失敗する問題が他のfloat64列とは異なるタイプのものであるカラムstrと思われます。列strを削除した場合、上のコードは完全に機能します。 .loc操作では、ABの列しか選択できないと私は理解していません。

問題は次のとおりです。My DataFrameは、タイプが異なる〜50個の列で構成されています。

これを解決するにはより良い方法がありますか?

+0

は、私の答えは役に立ちましたか? – Dark

答えて

1

オプション1: 又は有する: 又はnp.whereすなわち

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

オプション3を有する: 使用条件は、インデックスすなわち

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

オプション2と一致します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

ありがとう!多くの大規模なDataFramesで同様の操作を実行する必要があるので、すべてのオプションも同様に効率的ですか? –

関連する問題