【问题标题】:Applying an operation to a subset of the columns in a Dataframe in pandas将操作应用于熊猫数据框中的列的子集
【发布时间】:2017-03-06 16:07:38
【问题描述】:

给定一个DataFrame,例如:

   0  1  2
0 'a' 6  7  
1 'a' 8  9   

其中第一列由字符串组成,其他列是整数。我只想将乘以常数应用于第 1 列和第 2 列。也就是说,也避免将字符串相乘。 df = df*cnst 没有做到这一点。最干净的方法是什么?

【问题讨论】:

  • df.iloc[:, [1, 2]] *= cnst?

标签: python python-3.x pandas dataframe


【解决方案1】:

这里有一个更通用的解决方案:

数据:

In [200]: df
Out[200]:
     A  B    C          D
0  aaa  6  7.1 2001-01-01
1  bbb  8  9.2 2017-02-13

让我们找出所有数字列:

In [201]: num_cols = df.columns[df.dtypes.map(lambda x: np.issubdtype(x, np.number))]

In [202]: num_cols
Out[202]: Index(['B', 'C'], dtype='object')

现在我们只能对数字列进行数学运算:

In [203]: df[num_cols] *= 10

结果:

In [204]: df
Out[204]:
     A   B     C          D
0  aaa  60  71.0 2001-01-01
1  bbb  80  92.0 2017-02-13

数据类型:

In [205]: df.dtypes
Out[205]:
A            object
B             int64
C           float64
D    datetime64[ns]
dtype: object

【讨论】:

    【解决方案2】:

    您可以只使用iloc(用于基于整数位置的索引)或loc(用于基于标签的索引)来获取您希望相乘的列的子集。在这种情况下,任何一个都可以工作,因为您的列似乎是用数字标记的。我们还可以使用扩充赋值运算符*=。

    df.iloc[:, [1, 2]] *= cnst
    

    更多基本信息可以在文档的Indexing and Selecting Data 部分找到。

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 2019-03-19
      • 1970-01-01
      • 2019-02-07
      • 2015-05-18
      相关资源
      最近更新 更多