gpt4 book ai didi

python - 查找跨列位平均值的有效方法

转载 作者:行者123 更新时间:2023-12-01 01:01:32 24 4
gpt4 key购买 nike

考虑一个具有 N 列和 M 行的 df,其中每个条目都是一个 8 位整数。 N和M非常大。我们以 N=5M=10 为例:

>>> df = pd.DataFrame(np.random.randint(1, 10, (10, 5)), columns=list('abcde'))

>>> df
a b c d e
0 2 4 8 9 9
1 1 1 1 1 6
2 9 7 5 2 2
3 8 1 8 6 4
4 8 6 7 9 5
5 9 6 5 9 9
6 1 3 2 3 3
7 6 5 9 9 5
8 6 5 2 9 3
9 1 7 9 7 1

我想找到跨列的每个 8 位的平均值,并为每个创建一个新列。

在我们的示例中,这将导致以下结果(仅显示第一行):

>>> df
a b c d e Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
0 2 4 8 9 9 0 0 0 0 3/5=0.6 1/5=0.2 1/5=0.2 2/5=0.4
1 1 1 1 1 6
2 9 7 5 2 2
3 8 1 8 6 4
4 8 6 7 9 5
5 9 6 5 9 9
6 1 3 2 3 3
7 6 5 9 9 5
8 6 5 2 9 3
9 1 7 9 7 1

Bit0 列是通过对 LSB 进行平均而创建的 {0(来自 col a)、0(来自 col b)、0(来自 col c)、1(来自 col d)、 0(来自 col e)}Bit1 列除以 {1,0,0,0,0} 的平均值,依此类推,直到 Bit7 列对应于列的 MSB。

记住 NM 很大,实现这一目标的有效方法是什么?

最佳答案

我认为除了一次一点地求平均值之外,没有其他方法可以解决这个问题。 DataFrame.apply()是对数据帧执行操作的好方法。

import pandas as pd
import numpy as np

N=5
M=10
df = pd.DataFrame(np.random.randint(1, M, (M, N)), columns=list('abcde'))


for bitNum in range(8):
df[f'Bit{bitNum}'] = df.apply(lambda row : (sum([1 & (row[i] >> bitNum) for i in range(N)])), axis=1)

for bitNum in range(8):
df[f'Bit{bitNum}'] = df[f'Bit{bitNum}'].apply(lambda x : float(x)/N)

您会注意到,上面的代码在所有求和完成后进行除法以获得平均值。这是我在编码时遇到的一个奇怪的问题。如果您尝试在第一个 lambda 函数中添加除以 $N$ ,它会提示您正在执行 <<在 float 上并与整数进行比较。但是,如果我打印 df行然后再次尝试它有效...也许有人可以解释。无论如何,我相信上面的答案是有效的!

编辑:如果您使用的是 Python 3,则可以跳过第二个循环中的浮点转换。

关于python - 查找跨列位平均值的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55754768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com