数据
我有一个看起来像这样的数据集:
| id | string_col_A | string_col_B | creation_date |
|-------|--------------|--------------|---------------|
| x12ga | STR_X1 | STR_Y1 | 2020-11-01 |
| x12ga | STR_X1 | STR_Y1 | 2020-10-10 |
| x12ga | STR_X2 | STR_Y2 | 2020-11-06 |
| x21ab | STR_X4 | STR_Y4 | 2020-11-06 |
| x21ab | STR_X5 | STR_Y5 | 2020-11-02 |
| x11aa | STR_X3 | STR_Y3 | None |
目标
即上表的结果为:
| id | string_col_A | string_col_B |
|-------|--------------|--------------|
| x12ga | STR_X1 | STR_Y1 |
| x21ab | STR_X4 | STR_Y4 |
| x11aa | STR_X3 | STR_Y3 |
解释
x12ga
,解释很简单。STR_X1,STR_Y1出现两次,STR_X2,STR_Y2只出现一次(即,无tie分辨率)x11aa
也很简单,只有一行x21ab
,两个组合都有一行,但STR_X4、STR_Y4是最新的李>代码
以下是我到目前为止的情况:
def reducer(id_group):
id_with_sizes = id_group.groupby(
["id", "string_col_A", "string_col_B"], dropna=False).agg({
'creation_date': [len, max]
}).reset_index()
id_with_sizes.columns = [
"id", "string_col_A", "string_col_B", "row_count",
"recent_date"
]
id_with_sizes.sort_values(by=["row_count", "recent_date"],
ascending=[False, False],
inplace=True)
return id_with_sizes.head(1).drop(["recent_date", "row_count"], axis=1)
我这样称呼上述方法:
assignment = all_data.groupby("id").apply(inventor_reduce)
问题
当使用数据进行测试时,上面的代码工作得很好,但我正在使用的实际数据集有超过10M行,ID约为3M。因此,处理10K ID需要5分钟,总体上需要25小时。我想提高性能
解决方案
我在stackoverflow(和其他地方)上看到过关于获得频繁组合(尽管没有tie分辨率)和关于矢量化流程以提高性能的问题。我不太清楚如何实现这两个与我的问题以上
理想情况下,解决方案仍然是基于pandas的(pandas使代码看起来和读起来更好)
s
.groupby
代码中取出, sort=False
并在末尾进行排序让我们尝试使用
groupby
和transform
,然后获得最常见值的计数,然后使用drop_duplicates
和sort_values
您只需要按
id
列进行分组,并在此基础上查找最频繁的数据(模式)为了简化操作,您可以创建另一列
combined_str
:按
id
分组并使用pd.Series.mode
函数减少:相关问题 更多 >
编程相关推荐