Pandas按多列条目进行除法

2 投票
2 回答
551 浏览
提问于 2025-04-18 17:51

我刚开始接触Pandas,想知道如何对一个按多个列分组的数据框进行除法运算。我想要计算在某些条件下,'var1'和'var2'的'var3'所占的比例。可以把这个问题想象成,找出在工作时间内,按天和职业分类的工作时间百分比。'var3'是工作时间(根据df2的正常工作时间条件),按天和职业分组。

df = pd.DataFrame(data) ###all data, here all time 
df2 = df[(df['hours'] > x)] ### subset, here all time during normal business hours

df = df.groupby(["var1", "var2"]).var3.sum()
df2 = df2.groupby(["var1", "var2"]).var3.sum()
normal_bus_hours_percent = (df2.div(df, level=['var1', 'var2']) * 100)

但是我遇到了一个错误:TypeError: 在两个MultiIndex对象之间的连接是模糊的。

即使你能帮我合并这些数据框,我也会遇到这个错误:AttributeError: 'Series'对象没有'columns'属性。

如果我尝试连接,我会得到这个错误:TypeError: 第一个参数必须是类似列表的Pandas对象,你传入的是一个'Series'类型的对象。

我之前用的是R,所以我习惯了简单的cbind或merge操作。

2 个回答

1

我不太清楚你是怎么使用这个 groupby 的。这样写怎么样?

df1 = pandas.DataFrame([
    ['Atlanta', 'A', 1],
    ['Atlanta', 'A', 2],
    ['Atlanta', 'B', 3],
    ['Atlanta', 'B', 13],
    ['Boston', 'A', 4],
    ['Boston', 'A', 14],
    ['Boston', 'B', 5],
    ['Boston', 'B', 16],
    ['Portland', 'A', 7],
    ['Portland', 'A', 1],
    ['Portland', 'B', 9],
    ['Portland', 'B', 9],
    ['Seattle', 'B', 8],
    ['Seattle', 'B', 7],
    ['Seattle', 'C', 2],
    ['Seattle', 'C', 8],
], columns=['vars1', 'vars2', 'hours'])

df2 = df1[df1['hours'] > 6]

df1g = df1.groupby(by=['vars1', 'vars2']).sum()
df2g = df2.groupby(by=['vars1', 'vars2']).sum()

df2g.div(df1g).fillna(0)

这样会得到:

                   hours
vars1    vars2          
Atlanta  A      0.000000
         B      0.812500
Boston   A      0.777778
         B      0.761905
Portland A      0.875000
         B      1.000000
Seattle  B      1.000000
         C      0.800000
2

Pandas 默认是根据索引来对齐数据的,这样做是不是不管用呢?

 normal_bus_hours_percent = (df2.div(df) * 100)

撰写回答