gpt4 book ai didi

python - 如何检查一列的每个值是否正好映射到另一列中的一个值?

转载 作者:行者123 更新时间:2023-12-03 23:26:50 24 4
gpt4 key购买 nike

我有一个这样的数据框

import pandas as pd

df = pd.DataFrame({'A':list('bbcddee'), 'B': list('klmnnoi')})

A B
0 b k
1 b l
2 c m
3 d n
4 d n
5 e o
6 e i
我想从 A 列创建一个字典和 B使用例如
dict(zip(df.A, df.B))
在此之前,我想检查 A 中的每个值是否仅映射到 B 中的一个值;如果不是,则应抛出错误;以上情况并非如此 b映射到 kle映射到 oi .
接近它的一种方法是:
df[df.groupby('A', sort=False)['B'].transform(lambda x: len(set(x))) > 1]
返回
   A  B
0 b k
1 b l
5 e o
6 e i
但是,这需要 lambda这可能会使它变慢。有没有人看到加快速度的选项?

最佳答案

您可以 groupbynunique获取“B”中有多少个唯一值属于“A”中的每个唯一值。

df.groupby('A').B.nunique()
#A
#b 2
#c 1
#d 1
#e 2
#Name: B, dtype: int64
因此,您可以检查其中是否有超过 1 个映射:
df.groupby('A').B.nunique().gt(1).any()
#True

以上在概念上与您提出的没有什么不同。但是,如果您能够使用已“优化”的内置 groupby 操作,而不是需要循环的慢速 lambda,则通常会获得重大的性能提升。我们可以看到,随着 DataFrame 变大,lambda 会变慢近 100 倍,这在开始需要几秒钟来计算时是一个大问题。
import perfplot
import pandas as pd
import numpy as np

def gb_lambda(df):
return df.groupby('A')['B'].apply(lambda x: len(set(x))).gt(1)

def gb_nunique(df):
return df.groupby('A').B.nunique().gt(1)

perfplot.show(
setup=lambda n: pd.DataFrame({'A': np.random.randint(0, n//2, n),
'B': np.random.randint(0, n//2, n)}),
kernels=[
lambda df: gb_lambda(df),
lambda df: gb_nunique(df),
],
labels=['groupby with lambda', 'Groupby.nunique'],
n_range=[2 ** k for k in range(2,18)],
equality_check=np.allclose,
xlabel='~len(df)'
)
enter image description here

关于python - 如何检查一列的每个值是否正好映射到另一列中的一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62742322/

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