gpt4 book ai didi

python - Pandas:将一列列名转换为一列值

转载 作者:行者123 更新时间:2023-12-05 09:26:32 25 4
gpt4 key购买 nike

考虑以下数据框:

df = pd.DataFrame({'Col1': [1, 2, 3, 4, 5],
'Col2': [6, 7, 8, 9, 10],
'Select': ["Col1", "Col1", "Col2", "Col2", "Col1"]})

Col1 Col2 Select
0 1 6 Col1
1 2 7 Col1
2 3 8 Col2
3 4 9 Col2
4 5 10 Col1

“选择”列中的值是其他现有列的名称。它是一列列名。我想创建一个新列,其值与“选择”列所指示的值相同。所以我想要的输出是:

   Col1  Col2 Select  Values
0 1 6 Col1 1
1 2 7 Col1 2
2 3 8 Col2 8
3 4 9 Col2 9
4 5 10 Col1 5

因此它将一列列名映射到一列值。

最佳答案

可以先在Select中获取列名的整数位置,然后去NumPy域索引:

df["Values"] = df.to_numpy()[np.arange(len(df)), df.columns.get_indexer(df.Select)]

得到

>>> df

Col1 Col2 Select Values
0 1 6 Col1 1
1 2 7 Col1 2
2 3 8 Col2 8
3 4 9 Col2 9
4 5 10 Col1 5

索引器是:

In [144]: np.arange(len(df))
Out[144]: array([0, 1, 2, 3, 4])

In [145]: df.columns.get_indexer(df.Select)
Out[145]: array([0, 0, 1, 1, 0], dtype=int64)

所以我们将这些配对并从帧的底层 numpy 数组中选择 [0, 0]、[1, 0]、[2, 1]、...、[4, 0] 条目。


现已弃用的 df.lookup 可能已被使用...

In [143]: df.lookup(df.index, df.Select)
FutureWarning: The 'lookup' method is deprecated and will be
removed in a future version.You can use DataFrame.melt and DataFrame.loc
as a substitute.
Out[143]: array([1, 2, 8, 9, 5], dtype=int64)

一些无耻的时间...

有问题的DF;它是 5 x 3:

In [146]: %timeit np.diag(df[df.Select])
425 µs ± 9.29 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [147]: %timeit df.to_numpy()[np.arange(len(df)), df.columns.get_indexer(df.Select)]
208 µs ± 4.19 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

DF 但重复 1_000 次,即 5_000 x 3:

In [157]: df = pd.concat([df] * 1_000, ignore_index=True)

In [158]: %timeit np.diag(df[df.Select])
67.8 ms ± 3.02 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [159]: %timeit df.to_numpy()[np.arange(len(df)), df.columns.get_indexer(df.Select)]
542 µs ± 13.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

DF 但重复 100_000 次,即 500_000 x 3:

In [159]: df = pd.concat([df] * 100_000, ignore_index=True)

In [160]: %timeit np.diag(df[df.Select])
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
...

MemoryError: Unable to allocate 1.82 TiB for an array with shape (500000, 500000) and data type int64

In [155]: %timeit df.to_numpy()[np.arange(len(df)), df.columns.get_indexer(df.Select)]
41.5 ms ± 1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

这是因为基于 diag 的构造一个中间的大数组只是为了得到它的对角线...

关于python - Pandas:将一列列名转换为一列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73802400/

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