python - Python Dataframe:考虑每行不同的列
问题描述
让我们假设df
支架中的列是几个月,而行是随着时间的推移销售的不同产品(在列的月份中)。见下图。
传说:
- x:已售出的物品
- 0:没有卖
- 如何仅从绿色部分获取统计值?
但是不同的产品并没有一直卖完。有些产品在一定时期后没有销售,有些产品比其他产品更晚(生命周期)。
问题: df 上的操作,例如df.mean(axis=1)
遍历所有列。但要进行正确的库存分析,在操作中只需要考虑相关的时间范围(列数),图像中的绿色。但是,在整个时间段内计算的统计值会给出错误的图像,因为产品没有在该时间段的某些(外部)部分销售。
一个想法是在循环中进行迭代for
。但我知道这不是正确对待 df 的方法。那么有人知道如何以不同的方式处理数据框中的每一行以获得正确的统计值。
解决方案
IIUC 让我们尝试一下:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'c1': {'r1': 0, 'r2': 8, 'r3': 2, 'r4': 0, 'r5': 0},
'c2': {'r1': 0, 'r2': 2, 'r3': 0, 'r4': 6, 'r5': 0},
'c3': {'r1': 0, 'r2': 0, 'r3': 9, 'r4': 0, 'r5': 5},
'c4': {'r1': 0, 'r2': 0, 'r3': 0, 'r4': 2, 'r5': 9},
'c5': {'r1': 8, 'r2': 0, 'r3': 6, 'r4': 0, 'r5': 0}}
)
# Replace 0s with NaN (Invalidate 0 Values)
# Grab Values Between first valid index and last valid index
# Put the 0s back in between desired range
# Do Aggregate Computation
df['mean'] = df.replace(0, np.nan).apply(
lambda s: s[s.first_valid_index():s.last_valid_index()].fillna(0).mean(),
axis=1
)
print(df)
资源:
c1 c2 c3 c4 c5
r1 0 0 0 0 8
r2 8 2 0 0 0
r3 2 0 9 0 6
r4 0 6 0 2 0
r5 0 0 5 9 0
输出:
c1 c2 c3 c4 c5 mean
r1 0 0 0 0 8 8.000000 # 8 / 1
r2 8 2 0 0 0 5.000000 # (8 + 2) / 5
r3 2 0 9 0 6 3.400000 # (2 + 0 + 9 + 0 + 6) / 5
r4 0 6 0 2 0 2.666667 # (6 + 0 + 2) / 3
r5 0 0 5 9 0 7.000000 # (5 + 9) / 2
如果计算中不应包含零.fillna(0)
,则将apply
.
推荐阅读
- php - 批处理文件无法通过 php 工作(超时)
- laravel - 从任何控制器重定向到另一个控制器时,如何防止 laravel 5.2 中丢失的会话值?
- python-3.x - Python 3:即使使用相同的数据,子图也不同
- javascript - Angular 6:TypeError:无法读取未定义的属性“值”
- python - 如何使用火花流和 kafka 在 Python 中运行 STA/LTA 算法?
- javascript - 如何从 URL 中删除 HTML、CSS 和 Javascript 代码
- python - 用该数组的每个元素减去包含列表的 numpy 数组的最小值
- asynchronous - Dart 中的 await 关键字会自动处理数据依赖吗?
- scala - spark scala中的分区函数
- python - 在 GPU 上训练的模型上设置设备并在 CPU 上进行预测