pandas, multiply all the numeric values in the data frame by a constant

后端 未结 4 703
滥情空心
滥情空心 2021-01-01 17:37

How to multiply all the numeric values in the data frame by a constant without having to specify column names explicitly? Example:

In [13]: df = pd.DataFrame         


        
相关标签:
4条回答
  • 2021-01-01 18:16

    One way would be to get the dtypes, match them against object and datetime dtypes and exclude them with a mask, like so -

    df.ix[:,~np.in1d(df.dtypes,['object','datetime'])] *= 3
    

    Sample run -

    In [273]: df
    Out[273]: 
      col1  col2  col3
    0    A     1    30
    1    B     2    10
    2    C     3    20
    
    In [274]: df.ix[:,~np.in1d(df.dtypes,['object','datetime'])] *= 3
    
    In [275]: df
    Out[275]: 
      col1  col2  col3
    0    A     3    90
    1    B     6    30
    2    C     9    60
    
    0 讨论(0)
  • 2021-01-01 18:17

    The other answer specifies how to multiply only numeric columns. Here's how to update it:

    df = pd.DataFrame({'col1': ['A','B','C'], 'col2':[1,2,3], 'col3': [30, 10,20]})
    
    s = df.select_dtypes(include=[np.number])*3
    
    df[s.columns] = s
    
    print (df)
    
      col1  col2  col3
    0    A     3    90
    1    B     6    30
    2    C     9    60
    
    0 讨论(0)
  • 2021-01-01 18:19

    you can use select_dtypes() including number dtype or excluding all columns of object and datetime64 dtypes:

    Demo:

    In [162]: df
    Out[162]:
      col1  col2  col3       date
    0    A     1    30 2016-01-01
    1    B     2    10 2016-01-02
    2    C     3    20 2016-01-03
    
    In [163]: df.dtypes
    Out[163]:
    col1            object
    col2             int64
    col3             int64
    date    datetime64[ns]
    dtype: object
    
    In [164]: df.select_dtypes(exclude=['object', 'datetime']) * 3
    Out[164]:
       col2  col3
    0     3    90
    1     6    30
    2     9    60
    

    or a much better solution (c) ayhan:

    df[df.select_dtypes(include=['number']).columns] *= 3
    

    From docs:

    To select all numeric types use the numpy dtype numpy.number

    0 讨论(0)
  • 2021-01-01 18:27

    This should work even over mixed types within columns but is likely slow over large dataframes.

    def mul(x, y):
        try:
            return pd.to_numeric(x) * y
        except:
            return x
    
    df.applymap(lambda x: mul(x, 3))
    
    0 讨论(0)
提交回复
热议问题