gpt4 book ai didi

python - Pandas/Numpy 查找列标题和索引标题之间差异的方法

转载 作者:行者123 更新时间:2023-11-30 22:36:09 24 4
gpt4 key购买 nike

我有一个pandas dataFrame,如下所示:

import pandas as pd

cols = [1,2,5,15]
rows = [1,0,4]
data = pd.DataFrame(np.zeros((len(rows),len(cols))))
data.columns = cols
data.index = rows

1 2 5 15
1 0.0 0.0 0.0 0.0
0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0

我想找到列标题和索引/行标题之间的差异,以便绝对差异填充表格,如下所示:

    1   2   5   15
1 0.0 1.0 4.0 14.0
0 1.0 2.0 5.0 15.0
4 3.0 2.0 1.0 11.0

他们是 Pandas 或 Numpy 的方式吗?这里我使用一个小数据集,实际上我有近 1000,000 行和 100 列。我正在寻找一种快速有效的方法来进行此计算。谢谢

最佳答案

一种方法使用 NumPy broadcasting -

# Extract index and column as int arrays
indx = df.index.values.astype(int)
cols = df.columns.values.astype(int)

# Perform elementwise subtracttion between all elems of indx against all cols
a = np.abs(indx[:,None] - cols)
df_out = pd.DataFrame(a, df.index, df.columns)

示例输入、输出 -

In [43]: df
Out[43]:
1 2 5 15
1 0.0 0.0 0.0 0.0
0 0.0 0.0 0.0 0.0
4 0.0 0.0 0.0 0.0

In [44]: df_out
Out[44]:
1 2 5 15
1 0 1 4 14
0 1 2 5 15
4 3 2 1 11

或者,对于 df 中的原位编辑,请使用 df[:] -

In [58]: df[:] = a

In [59]: df
Out[59]:
1 2 5 15
1 0 1 4 14
0 1 2 5 15
4 3 2 1 11

此外,如果我们确实可以访问索引和列信息,我们可以直接从它们获取a,就像这样 -

a = np.abs(np.asarray(rows)[:,None] - cols)

进一步提升性能

我们可以使用 numexpr module 进一步提升它对大型数据集执行这些绝对计算以获得a,就像这样 -

import numexpr as ne

def elementwise_abs_diff(rows, cols): # rows would be indx
I = np.asarray(rows)[:,None]
return ne.evaluate('abs(I - cols)')

这给了我们a,它可以被用来创建前面显示的df_out或分配回df

时间安排 -

In [93]: rows = np.random.randint(0,9,(5000)).tolist()

In [94]: cols = np.random.randint(0,9,(5000)).tolist()

In [95]: %timeit np.abs(np.asarray(rows)[:,None] - cols)
10 loops, best of 3: 65.3 ms per loop

In [96]: %timeit elementwise_abs_diff(rows, cols)
10 loops, best of 3: 32 ms per loop

关于python - Pandas/Numpy 查找列标题和索引标题之间差异的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44297719/

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