【问题标题】:Pandas - Applying formula on all column based on a value on the rowPandas - 根据行上的值在所有列上应用公式
【发布时间】:2022-11-28 14:17:55
【问题描述】:

假设我有一个如下所示的数据框

+------+------+------+-------------+
|  A   |   B  |  C   | devisor_col |
+------+------+------+-------------+
|    2 |    4 |   10 |           2 |
|    3 |    3 |    9 |           3 |
|   10 |   25 |   40 |          10 |
+------+------+------+-------------+

使用 devisor_col 中的值应用公式的最佳命令是什么。请注意,我有数千列和行。

结果应该是这样的:

+------+------+------+-------------+
| A    | B    | V    | devisor_col |
+------+------+------+-------------+
|    1 |    2 |    5 |           2 |
|    1 |    1 |    3 |           3 |
|    1 |  1.5 |    4 |          10 |
+------+------+------+-------------+

我尝试使用 apply map 但我不知道为什么我不能将它应用于所有列。

modResult = my_df.applymap(lambda x: x/x["devisor_col"]))

【问题讨论】:

  • 你试过df['Col1'] = df['Col1']/df['devisor_col']了吗?

标签: python pandas


【解决方案1】:

IIUC,在axis=0上使用pandas.DataFrame.divide

modResult= (
        pd.concat(
            [my_df, my_df.filter(like="Col") # selecting columns
                   .divide(my_df["devisor_col"], axis=0).add_suffix("_div")], axis=1)
           )

# 输出 :

print(modResult)

   Col1  Col2  Col3  devisor_col  Col1_div  Col2_div  Col3_div
0     2     4    10            2       1.0       2.0       5.0
1     3     3     9            3       1.0       1.0       3.0
2    10    25    40           10       1.0       2.5       4.0

如果您只需要除法的结果,请使用:

modResult= my_df.filter(like="Col").divide(my_df["devisor_col"], axis=0)

print(modResult)

   Col1  Col2  Col3
0   1.0   2.0   5.0
1   1.0   1.0   3.0
2   1.0   2.5   4.0

您可以将 my_df.filter(like="Col") 替换为 my_df.loc[:, my_df.columns!="devisor_col"]

【讨论】:

  • 如果列名不同怎么办
  • 在我的回答末尾使用.loc
猜你喜欢
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 2016-09-01
  • 2021-02-21
相关资源
最近更新 更多