bugfix> python > 投稿

質問: df をどのようにグループ化しますか変数に基づいて、 for を使用して計算を行いますループ?

タスクは、列の値に基づいて条件付き計算を行うことです。ただし、計算定数は参照列の値に依存します。この df を考える :

In [55]: df = pd.DataFrame({
    ...:     'col1' : ['A', 'A', 'B', np.nan, 'D', 'C'],
    ...:     'col2' : [2, 1, 9, 8, 7, 4],
    ...:     'col3': [0, 1, 9, 4, 2, 3],
    ...: })
In [56]: df
Out[56]: 
  col1  col2  col3
0    A     2     0
1    A     1     1
2    B     9     9
3  NaN     8     4
4    D     7     2
5    C     4     3

私はソリューションを使用しましたここに  'math' を挿入するには col3 から残高を取得する列そして、10を追加します。しかし、今、リストを反復して col1 の値に依存する計算変数を設定したいです。 。結果は次のとおりです。

In [57]: items = ['A', 'D']
In [58]: for item in items:
    ...:     df.loc[:, 'math'] = df.loc[df['col1'] == item, 'col3']
    ...:     
In [59]: df
Out[59]: 
  col1  col2  col3  math
0    A     2     0   NaN
1    A     1     1   NaN
2    B     9     9   NaN
3  NaN     8     4   NaN
4    D     7     2   2.0
5    C     4     3   NaN

明らかな問題は、dfが各反復で上書きされることです。ザ・ math インデックス0および1の列は、最初の反復で値を計算しましたが、2番目の反復で削除されます。結果の df リストの最後の要素のみを考慮します。

各インデックス値を反復処理するコーディングを追加できますが、それはpythonicよりも哀れなようです。

.mul() の期待される出力例

In [100]: df
Out[100]: 
  col1  col2  col3  math
0    A     2     0   0.0
1    A     1     1  10.0
2    B     9     9   NaN
3  NaN     8     4   NaN
4    D     7     2  20.0
5    C     4     3   NaN

回答 2 件
  • 現在のメソッドの問題は、後続の各反復の出力がその前の反復の出力を上書きすることです。そのため、最後のアイテムだけが出力され、それ以上は出力されません。

    items の要素を持つすべての行を選択します  前と同じように割り当てます。

    df['math'] = df.loc[df.col1.isin(items), 'col3'] * 10
    
    

    または、

    df['math'] = df.query("col1 in @items").col3 * 10
    
    

    あるいは、

    df['math'] = df.col3.where(df.col1.isin(items)) * 10
    
    
    df
      col1  col2  col3  math
    0    A     2     0   0.0
    1    A     1     1  10.0
    2    B     9     9   NaN
    3  NaN     8     4   NaN
    4    D     7     2  20.0
    5    C     4     3   NaN
    
    

  • assignで失敗する理由は、各forループで新しい値を使用してMathを割り当てるためです。以下のように、最後の1つだけを表示し、forループの後の結果に表示します

    0     0.0
    1    10.0
    2     NaN
    3     NaN
    4     NaN
    5     NaN
    Name: col3, dtype: float64
    0     NaN
    1     NaN
    2     NaN
    3     NaN
    4    20.0
    5     NaN
    Name: col3, dtype: float64
    
    

    以下でそれを行うことができます

    df.loc[df.col1.isin(items),'math']=df.col3*10
    df
    Out[85]: 
      col1  col2  col3  math
    0    A     2     0   0.0
    1    A     1     1  10.0
    2    B     9     9   NaN
    3  NaN     8     4   NaN
    4    D     7     2  20.0
    5    C     4     3   NaN
    
    

あなたの答え