Python 按其他列计算列值

标签 python pandas

我有这样的表格:

no  Order   materials   status
1   1000    100         available
2   1000    200         not available
3   1001    500         Feb-20
4   1002    400         available
5   1002    300         not available
6   1002    600         available
7   1002    900         available
8   1003    700         available
9   1003    800         available

我希望有一些列显示:

  1. 每个订单的 Material 总数
  2. 每个订单的 Material 总数及其状态

我能够获取每个订单的 Material 总数:

ds.groupby('Order').count()
ds['Total Materials'] = ds.groupby('Order')['Order'].transform('count')

但不确定如何根据状态等于每个状态的条件添加新列,以便它看起来像这样:

no  Order   materials   status         Total Materials  available   not available   Feb-20
1   1000    100         available       2                    1            1           0
2   1000    200         not available   2                    1            1           0
3   1001    500         Feb-20          1                    0            0           1
4   1002    400         available       4                    3            1           0
5   1002    300         not available   4                    3            1           0
6   1002    600         available       4                    3            1           0
7   1002    900         available       4                    3            1           0
8   1003    700         available       2                    2            0           0
9   1003    800         available       2                    2            0           0

基本上是想弄清楚如何获取其余的列。感谢您的帮助!

最佳答案

我会结合使用数据透视表合并:

ds_final = ds.merge(ds.pivot_table(values='Total Materials',index=['Order'],columns='status',aggfunc='count',fill_value=0).reset_index(),how='left',on='Order')
print(ds_final)

输出:

   no  Order  materiales  status  Total Materials  A  Feb-20  not A
0   1   1000         100       A                2  1       0      1
1   2   1000         200   not A                2  1       0      1
2   3   1001         500  Feb-20                1  0       1      0
3   4   1002         400       A                4  3       0      1
4   5   1002         300   not A                4  3       0      1
5   6   1002         600       A                4  3       0      1
6   7   1002         900       A                4  3       0      1
7   8   1003         700       A                2  2       0      0
8   9   1003         800       A                2  2       0      0

一些额外的解释:

数据透视表有助于从 status 列生成列。所以这是单独的数据透视表的输出:

status  Order  A  Feb-20  not A
0        1000  1       0      1
1        1001  0       1      0
2        1002  3       0      1
3        1003  2       0      0

最后,通过此输出,我们可以使用 mergeconcat 来生成所需的输出。

关于Python 按其他列计算列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60299516/

相关文章:

python - 将字段传递给函数。 PYTHON.Pandas

python - Python 中的函数调用和用户输入带扩展名的文件名

python - 如何使用visual studio code调试django

python - 如果满足当前条件,For 循环不会处理下一个元素

python - 使用 pandas 按行值索引列值

python - 为什么 numpy/pandas 解析长行的 csv 文件这么慢?

python - Pandas :获取数据帧中对角线下方的元素(索引,列)

python - 为什么转置后的 Pandas 数据框比原来的小?

python - 在循环中创建的 Matplotlib 子图不显示数据

python - 是否可以合并两个有相似之处的表