pandas 有没有更好的方法来替换python中的“for”循环?

rqdpfwrv  于 2022-12-16  发布在  Python
关注(0)|答案(1)|浏览(133)

有人能帮帮我吗?
我有一个巨大的 Dataframe 要处理(9万行),我需要应用此逻辑,但我只能想到使用“for”循环来解决问题,这几乎需要2个小时的运行时间......有人能给予我如何优化代码吗?
其逻辑如下:对于每个“客户”,我需要检查其“FinalKey”是否存在于“Key”列中。如果存在,则此客户的“Final Name”将与“Key”中相同“FinalKey”的“Customer”中重复次数最多的名称相同。下面是一个示例:

创建 Dataframe df

data = [['Tom','123', '123'], ['Tom', '54', '123'], \
    ['Tom', '21', '123'], ['Tom2', '123', '123'], \
    ['Tom3', '123', '123'], ['Tom3', '123', '123'], \
    ['John', '45', '45'], ['Mary', '23', '41']]

df = pd.DataFrame(data, columns=['Customer', 'Key', 'FinalKey'])
df['Final Name']=''

打印 Dataframe

df
| 客户|关键词|最终密钥|最终名称|
| - ------|- ------|- ------|- ------|
| 汤姆|一百二十三|一百二十三||
| 汤姆|五十四|一百二十三||
| 汤姆|二十一|一百二十三||
| 汤姆2|一百二十三|一百二十三个||
| 汤姆3|一百二十三|一百二十三||
| 汤姆3|一百二十三|一百二十三||
| 约翰|四十五|四十五||
| 玛丽|四十一|四十一||
逻辑是这样的:
逻辑

for i in range(0, len(df['Customer'])):  

if str(df.loc[i, 'FinalKey']) in list(df['Key']):    
    df.loc[i, 'Final Name'] = df[df['Key']==df.loc[i, 'FinalKey']]['Customer'].value_counts().idxmax()

else:
    df.loc[i, 'Final Name'] = ""

df

| Customer |   Key   | FinalKey | Final Name | 
| -------- | ------- | -------- | ---------- |
|   Tom    |   123   |    123   |    Tom3    |
|   Tom    |    54   |    123   |    Tom3    |
|   Tom    |    21   |    123   |    Tom3    |
|   Tom2   |   123   |    123   |    Tom3    |
|   Tom3   |   123   |    123   |    Tom3    |
|   Tom3   |   123   |    123   |    Tom3    |
|   John   |    45   |     45   |    John    |
|   Mary   |    23   |     41   |            |
ttisahbt

ttisahbt1#

我肯定有更好的办法,但这个有效:

top_cust_by_key = df[['Key', 'Customer']].groupby('Key').agg(lambda x: x.value_counts().index[0])['Customer']
df['Final Name'] = df['FinalKey'].map(top_cust_by_key)

相关问题