pandas,将数据帧中的所有数值乘以一个常数



如何在不必显式指定列名的情况下将数据帧中的所有数值乘以常数?示例:

In [13]: df = pd.DataFrame({'col1': ['A','B','C'], 'col2':[1,2,3], 'col3': [30, 10,20]})
In [14]: df
Out[14]: 
  col1  col2  col3
0    A     1    30
1    B     2    10
2    C     3    20

我尝试了df.multiply,但它也会通过多次串联来影响字符串值。

In [15]: df.multiply(3)
Out[15]: 
  col1  col2  col3
0  AAA     3    90
1  BBB     6    30
2  CCC     9    60

有没有一种方法可以在只将数值乘以常数的同时保持字符串值的完整性?

您可以使用select_dtypes(),包括number数据类型或排除objectdatetime64数据类型的所有列:

演示:

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

或者更好的解决方案(c)ayhan:

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

来自文档:

要选择所有数字类型,请使用numpy dtype numpy.number

另一个答案指定如何只与数字列相乘。以下是如何更新:

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

一种方法是获取dtypes,将它们与objectdatetime数据类型进行匹配,并使用掩码将它们排除在外,如so-

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

样品运行-

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

这即使在列中的混合类型上也应该有效,但在大型数据帧上可能会很慢。

def mul(x, y):
    try:
        return pd.to_numeric(x) * y
    except:
        return x
df.applymap(lambda x: mul(x, 3))

使用assign()select_dtypes()的简单解决方案:

df.assign(**df.select_dtypes('number')*3)

最新更新