【发布时间】:2022-01-10 15:20:00
【问题描述】:
我有一个包含人们地址和姓名的数据框。我有一个处理我想要应用的名称的函数。我正在创建具有匹配地址的人员的子选择并将该功能应用于这些组。
至此我一直使用.loc如下
for x in df['address'].unique():
sub_selection = df.loc[df['address'] == x]
sub_selection.apply(lambda x: function(x), axis = 1)
有没有更有效的方法来解决这个问题。我正在研究 pandas .groupby() 功能,但我正在努力让它工作。
df.groupby('address').agg(lambda x: function(x['names']))
这是一些示例数据:
address, name, Unique_ID
1022 Boogie Woogie Ave, John Smith, np.nan
1022 Boogie Woogie Ave, Frederick Smith, np.nan
1022 Boogie Woogie Ave, John Jacob Smith, np.nan
3030 Sesame Street, Big Bird, np.nan
3030 Sesame Street, Elmo, np.nan
3030 Sesame Street, Big Yellow Bird, np.nan
我的函数本身有一些移动部分,但基本上我会根据我创建的参考字典检查名称。此过程会通过其他一些步骤,但会返回名称匹配的索引列表。我使用这些索引为匹配的名称分配一个共享的唯一 ID。在我的示例中,大鸟和大黄鸟会匹配。
def function(x):
match_list = []
if x['name'] in __lookup_dict[0]:
match_list.append((__lookup_dict[0][x['name']))
#reduce all elements matching list to a single list of place ids matching all elements
result = set(match_list[0])
for s in match_list[1:]:
if len(result.intersection(s)) != 0:
result.intersection_update(s)
#take the reduce lists and assign each place id an unique id.
#note we are working with place ids not the sub df's index. They don't match
if pd.isnull(x['Unique_ID']):
uid = str(uuid.uuid4())
for g in result:
df.at[df.index[df.index == g].tolist()[0], 'Unq_ID'] = uid
else:
pass
return result
【问题讨论】:
-
你能分享一下什么不起作用的细节吗?一些示例数据也会有所帮助!
-
当然,我正在努力将一个函数传递给 groupby 对象,以便在所有子选择上独立运行该函数。我发布的初始功能有效,但速度很慢,而且我正在处理数百万条记录的数据集。该功能的基础是匹配人们的姓名,我只关心人们共享相同地址的姓名。所以特别是 groupby 函数,它似乎只接受向量化函数(我在这里可能错了),我的函数并不意味着向量化。所以函数本身并没有传递给对象
-
知道了,谢谢!我真的需要看到一个独立的、可运行的示例,包括数据和
function的定义。 -
我已经附加了这个问题。我试图将功能简化为相关步骤。如果有任何不清楚的地方,请告诉我
标签: python pandas performance pandas-groupby