我附上了一个示例数据集。我的实际数据集要大得多。“yr”列被分为“cd”和“qty”,从yr 10到yr 1。不是每行都包含完整的数据集,有些包含零。示例数据:
| 销售|YR10CD| 10年数量|YR9CD|公司简介|YR8CD| y8qty|
| --|--|--|--|--|--|--|
| 42 |一| 45 |一| 47 |一| 49 |
| 56 |不| 58 |一| 52 | 0 | 0 |
| 78 |一| 75 | 0 | 0 | 0 | 0 |
我希望能够取qty列(yr 10 qty,yr 9 qty,yr 8 qty等)的平均值,但仅当相邻列中的相关指标(yr 10 cd,yr 9 cd,yr 8 cd等)为“A”值时。如果相关指标为0或任何其他值,如“T”,我不想将其包括在平均值计算中。
我试过使用一个函数,它利用if语句将值附加到列表中,然后对非零值取平均值。然后,使用df.apply将该函数应用于df中的每一行。不幸的是,我对所有平均值都得到0,这是不期望的。
这里是预期输出。它是我的df中添加的一列,包含该行的平均值。预期输出:
| 销售|YR10CD| 10年数量|YR9CD|公司简介|YR8CD| y8qty|平均|
| --|--|--|--|--|--|--|--|
| 42 |一| 45 |一| 47 |一| 49 | 47 |
| 56 |不| 58 |一| 52 | 0 | 0 | 52 |
| 78 |一| 75 | 0 | 0 | 0 | 0 | 75 |
我已经尝试搜索堆栈溢出一段时间了,我遇到的解决方案都不适合我的特定场景。
5条答案
按热度按时间6psbrbz91#
在某些情况下,列的结构可能是未知的,扩展到MultiIndex来执行操作可能是有用的,这允许我们利用pandas索引来确保计算期间的数据完整性。
假设一个
yr[num]cd
与yr[num]qty
配对的结构,我们可以隔离这些列并创建一个多索引,这样[num]值就在它们自己的级别中。字符串
在这里,我将感兴趣的列隔离到变量
v
中,并通过使用replace和split重新构造列,以便cd
和qty
的值位于级别0,数字位于级别1。V看起来像:
型
注意,有很多方法可以将列重组为MultiIndex。这里有另一个示例供参考:
型
根据列名格式的不同,不同的方法可能更适合重构。
具有这种级别顺序的MultiIndex的主要好处是,我们可以通过访问
v['cd']
和v['qty]
来轻松访问所有cd
列和qty
列。v['qty']
供参考:型
这样做的好处是,无论列的顺序如何,我们都可以可靠地对齐10,9和8之间的计算。
这允许我们过滤出where是equal to 'A'
v['qty'].where(v['cd'].eq('A'))
:型
然后在
v['qty'].where(v['cd'].eq('A')).mean(axis='columns')
行上取mean:型
它与
df
具有相同的索引,因此我们可以非常简单地将值赋值回来型
df
与新列:型
同样,这种方法的优点是我们的初始数据列顺序并不重要。
想象一下这样一种情况,我们的
cd
列按升序与数字分组,我们的qty
列按降序与数字分组。| 销售|YR8CD| YR9CD| YR10CD| 10年数量|公司简介|y8qty|
| --|--|--|--|--|--|--|
| 42 |一|一|一| 45 | 47 | 49 |
| 56 | 0 |一|不| 58 | 52 | 0 |
| 78 | 0 | 0 |一| 75 | 0 | 0 |
或者,也许更现实地,想象一个场景,有人不小心把其中一列拖乱了顺序。这里概述的方法仍然会产生正确的平均值,因为计算和值过滤是基于数值而不是它们在DataFrame中的相对位置进行对齐的。
型
因此,虽然这可能不是最快的解决方案或最有效的内存,但它 * 是 * 相当高的性能,同时不会牺牲索引可以提供的任何对齐完整性检查。
带有版本号的完整工作示例
gk7wooem2#
另一个可能的解决方案:
字符串
输出量:
型
lxkprmvk3#
利用交替对
cd/qty
,mask
和非A
,然后计算mean
:字符串
Ouptut:
型
oyxsuwqo4#
这里有一个非常零碎的答案,应该工作:
字符串
说明:创建一个临时的df。对于每个'cd'列,如果值不是'A',则将相邻'qty'列的值替换为None。然后,当我们对所有'qty'列进行行平均时,我们可以跳过具有None值的'qty'列。最后,当我们进行行平均时,我们同时在原始df中创建一个新列,并分配这些平均值的结果。
tsm1rwdh5#
使用for循环方式的Row-Method:
字符串
输出量:
型
矢量化方式:
型
输出量:
型