首页 > 解决方案 > Python Dataframe:考虑每行不同的列

问题描述

让我们假设df支架中的列是几个月,而行是随着时间的推移销售的不同产品(在列的月份中)。见下图。

传说

在此处输入图像描述

但是不同的产品并没有一直卖完。有些产品在一定时期后没有销售,有些产品比其他产品更晚(生命周期)。

问题: df 上的操作,例如df.mean(axis=1)遍历所有列。但要进行正确的库存分析,在操作中只需要考虑相关的时间范围(列数),图像中的绿色。但是,在整个时间段内计算的统计值会给出错误的图像,因为产品没有在该时间段的某些(外部)部分销售。


一个想法是在循环中进行迭代for。但我知道这不是正确对待 df 的方法。那么有人知道如何以不同的方式处理数据框中的每一行以获得正确的统计值。

标签: pythonpandasdataframe

解决方案


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.


推荐阅读