gpt4 book ai didi

python - 在 Pandas 中分配单元格值的最快方法

转载 作者:太空宇宙 更新时间:2023-11-04 11:14:20 25 4
gpt4 key购买 nike

我有一个元组列表:

d = [("a", "x"), ("b", "y"), ("a", "y")]

DataFrame:

     y    x
b 0.0 0.0
a 0.0 0.0

如果行和列标签对应于 d 中的元组,我想用 1 替换任何 0,这样新的数据框是:

     y    x
b 1.0 0.0
a 1.0 1.0

我目前正在使用:

for i, j in d:
df.loc[i, j] = 1.0

在我看来,这似乎是最“pythonic”的方法,但对于形状为 20000 * 20000 的 DataFrame 和长度为 10000 的列表,这个过程实际上需要永远。必须有更好的方法来实现这一点。有什么想法吗?

谢谢

最佳答案

方法 #1:d 中没有错误条目

这是一种基于 NumPy 的方法 -

def assign_val(df, d, newval=1):    
# Get d-rows,cols as arrays for efficient usage latet on
di,dc = np.array([j[0] for j in d]), np.array([j[1] for j in d])

# Get col and index data
i,c = df.index.values.astype(di.dtype),df.columns.values.astype(dc.dtype)

# Locate row indexes from d back to df
sidx_i = i.argsort()
I = sidx_i[np.searchsorted(i,di,sorter=sidx_i)]

# Locate column indexes from d back to df
sidx_c = c.argsort()
C = sidx_c[np.searchsorted(c,dc,sorter=sidx_c)]

# Assign into array data with new values
df.values[I,C] = newval
# Use df.to_numpy(copy=False)[I,C] = newval on newer pandas versions
return df

sample 运行-

In [21]: df = pd.DataFrame(np.zeros((2,2)), columns=['y','x'], index=['b','a'])

In [22]: d = [("a", "x"), ("b", "y"), ('a','y')]

In [23]: assign_val(df, d, newval=1)
Out[23]:
y x
b 1.0 0.0
a 1.0 1.0

方法 #2:通用方法

如果 `d 中有任何条目,我们需要过滤掉它们。因此,针对该通用案例的修改版将是 -

def ssidx(i,di):
sidx_i = i.argsort()
idx_i = np.searchsorted(i,di,sorter=sidx_i)
invalid_mask = idx_i==len(sidx_i)
idx_i[invalid_mask] = 0
I = sidx_i[idx_i]
invalid_mask |= i[I]!=di
return I,invalid_mask

# Get d-rows,cols as arrays for efficient usage latet on
di,dc = np.array([j[0] for j in d]), np.array([j[1] for j in d])

# Get col and index data
i,c = df.index.values.astype(di.dtype),df.columns.values.astype(dc.dtype)

# Locate row indexes from d back to df
I,badmask_I = ssidx(i,di)

# Locate column indexes from d back to df
C,badmask_C = ssidx(c,dc)

badmask = badmask_I | badmask_C

goodmask = ~badmask

df.values[I[goodmask],C[goodmask]] = newval

关于python - 在 Pandas 中分配单元格值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57373034/

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