gpt4 book ai didi

python - 如何使用复杂的条件以有效的方式在 Pandas 中逐列填充?

转载 作者:行者123 更新时间:2023-12-03 19:15:54 24 4
gpt4 key购买 nike

我有几本旧书,每一页都充满了移民及其家庭的历史记录。大多数变量只为父亲填写,通常被视为家庭的首领。所以,例如,如果移民家庭要住在一个叫做“西部小城”的城市,只有父亲会有这个信息,而母亲和 child 应该去同一个命运。此外,一些观察结果根本没有任何信息,即使对于父亲也是如此。

我想要做的只是为同一个家庭(即同一个老板)中的亲戚填补缺失值。我已经找到了一个解决方案,但它的效率太低了,而且我担心我将一些相当简单的事情复杂化了。下面我使用一个示例数据集来展示我的解决方案。

示例数据集:

m=1

test=pd.DataFrame({'destino_heranca':['A','','','','C','']*m, 'num_familia_raw':[1,1,2,2,3,3]*m}, index=range(6*m))

test

请注意,个人 1 拥有城市 一个 作为命运,因为这里来自家庭 1。另一方面,家庭 2 必须是最终数据集中缺少的信息,因为我什至没有老板的信息。
destino_heranca num_familia_raw
0 A 1
1 1
2 2
3 2
4 C 3
5 3

然后,我创建了一个名为 isdest_null 的字典。其中键是家庭号码,值是 bool 值,如果家庭老板有信息,则为 True,否则为 False:
def num_familia_raw_dest(m):
return list(set(test[test['num_familia_raw']==m].destino_heranca.values))

isdest_null={k:('' in num_familia_raw_dest(k)) & (len(num_familia_raw_dest(k))==1) for k in test.num_familia_raw.unique()}

在名为 heritage.py 的单独可执行文件中我定义了以下函数:
import numpy as np
def heritage(col, data, empty_map):
for k in data.num_familia_raw.unique():
if empty_map[k]:
data[data.num_familia_raw==k]=data[data.num_familia_raw==k].replace({'{}_heranca'.format(col):{'':'nao informado'}})

#information doesn't exist
condition1=(data['{}_heranca'.format(col)]=='')
#same family
condition2=(data['num_familia_raw']==data['num_familia_raw'].shift(1))

while '' in data.groupby('num_familia_raw').last()['{}_heranca'.format(col)].values:
data['{}_heranca'.format(col)]=np.where(condition1 & condition2,data['{}_heranca'.format(col)].shift(1),data['{}_heranca'.format(col)])

return data['{}_heranca'.format(col)]

使用适当的导入运行完整代码会产生:
0                A
1 A
2 nao informado
3 nao informado
4 C
5 C

这正是我想要的。然而,这个解决方案非常低效,我的真实数据有近 200 万行。

使用 timeit 衡量性能

我正在尝试衡量我的实现的性能,以将其与我最终开发的其他解决方案进行比较,如果有人帮助更好地理解它,我将不胜感激。这是我的代码:
import timeiit

timeit.timeit("heritage('destino', data=test, empty_map=isdest_null)",number=1000, globals=globals())

输出:
23.539601539001524

我不确定如何解释它,但根据文档,这意味着 23 seconds per loop但这对我来说意味着什么?

最佳答案

如果可用destino_heranca总是首先出现在每个 num_familia_raw ,那么你可以做一个 transform :

test['destino_heranca'] = (test.groupby('num_familia_raw')['destino_heranca']
.transform('first')
.replace('','nao informado')
)

输出:
  destino_heranca  num_familia_raw
0 A 1
1 A 1
2 nao informado 2
3 nao informado 2
4 C 3
5 C 3

关于python - 如何使用复杂的条件以有效的方式在 Pandas 中逐列填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60642987/

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