gpt4 book ai didi

python - 操作数据框字典

转载 作者:行者123 更新时间:2023-11-28 21:31:36 26 4
gpt4 key购买 nike

我有以下数据框:

Name1  Number1  Name2  Number2  Group
R 1 G 5 1
B EXP Y 9 2
Y 225 L 185 2
F 17 D 2 2
H 259 G 175 3
X 172 Q EXP 3

我正在尝试搜索每个“组”并查看任一 数字列中的任何数字是否在特定范围内。如果该范围内的组中存在一个值,我想将组中的 ALL 名称附加到列表中。一个很大的障碍是数字列可能偶尔包含字符串,这些字符串的处理方式与处理超出范围的数字的方式相同。

在这个例子中,我们假设范围是 200-300

搜索组后的结果列表将是:

L = [B,Y,Y,L,F,D,H,G,X,Q]

请注意,列表中没有第 1 组的名称,因为第 1 组的 Number1/Number2 列中不包含指定范围内的任何值。

到目前为止我的代码:

newList = {}
dict_of_groups = {k: v for k, v in df.groupby('Group')}
for df in dict_of_groups.values()
if df[df['Number1'] | df['Number2'] > 199]: #how do I specify AND < 300 here?
a = df['Number1'].values.tolist()
b = df['Number2'].values.tolist()
newList.update(a,b)

我对如何有效地操作 dict_of_dataframes 中的每个数据帧感到有点困惑。关于如何最好地与这些群体合作有什么建议吗?

最佳答案

您的列中有一些无效值,必须将这些值转换为有效数值才能执行有效比较。你在这里有几个选择,你可以只使用 pandas 操作,并执行较慢的 groupby,或者你可以下拉到 numpy一个非常有效的解决方案。

选项 1
堆栈 + unstack + groupby + transform


names = df.filter(like='Name').to_numpy()

m = (pd.to_numeric(df.filter(like='Number').stack(), errors='coerce')
.between(200, 300).unstack())

mask = m.groupby(df['Group']).transform('any').any(1)

names[mask].ravel().tolist()

['B', 'Y', 'Y', 'L', 'F', 'D', 'H', 'G', 'X', 'Q']

选项 2
使用 np.add.at 和一些掩码的更快的 numpy 解决方案

a = df.filter(like='Name').to_numpy().ravel()
b = df.filter(like='Number').to_numpy().ravel()
c = np.repeat(df['Group'].to_numpy(), a.shape[0] // df.shape[0])
n = pd.to_numeric(b, errors='coerce')


f = np.zeros(c.max()+1, dtype=int)
m = np.logical_and(n >= 200, n <= 300)
np.add.at(f, c, m)

mask = f[c].astype(bool)

a[mask]

array(['B', 'Y', 'Y', 'L', 'F', 'D', 'H', 'G', 'X', 'Q'], dtype=object)

时间

df = pd.concat([df]*1000, ignore_index=True)

%timeit chris_stack()
22.7 ms ± 1.86 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit chris_numpy()
11.9 ms ± 153 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\

%timeit quang()
16.7 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit jezrael()
78.5 ms ± 685 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - 操作数据框字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57806220/

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