首页 > 解决方案 > 根据一列的值划分数据框的行

问题描述

我有一个数据框:

import pandas as pd

df1 = pd.DataFrame({"Line":['Sales', 'Volume', 'ANR', 'EBT'], "a":[10, 4, 64, 32],
         "b":[4, 8, 32, 48],
         "c":[16, 4, 8, 24]})

我想将每一行除以不同的常数。所以我想将“销售额”除以 10,“量”除以 1,“ANR”除以 100,“EBT”除以 1。我可以执行以下操作:

df2 = pd.DataFrame({"A":[10, 1, 100, 1]})
df3 = df1.iloc[:, 1:].div(df2.A, axis=0)

这让我得到了这个特定示例的正确答案。但我希望操作更智能。我希望它在 Line 列中查找值。如果是“销售额”,则除以 10 等。

原因是我正在使用的数据框有 1000 行。我不想创建和维护像 df2 这样的系列。

对于上面的示例,答案应如下所示:

df3 = pd.DataFrame({"Line":['Sales', 'Volume', 'ANR', 'EBT'], "a":[1, 4, 0.64, 32],
         "b":[0.4, 8, 0.32, 48],
         "c":[1.6, 4, 0.8, 24]})

标签: pandasdataframeconditional-statements

解决方案


您可以将除数规则收集到字典中:

div = {'Sales' : 10, 'Volume' : 1, 'ANR' : 100, 'EBT':1}

然后将列'a','b','c'除以map'Line'的a获得的列div

df1[['a','b','c']] = df1[['a','b','c']].div( df1['Line'].map(div), axis = 0)
df1

获得

    Line    a       b       c
0   Sales   1.00    0.40    1.60
1   Volume  4.00    8.00    4.00
2   ANR     0.64    0.32    0.08
3   EBT     32.00   48.00   24.00

推荐阅读