我最近遇到一个问题,即在将 Pandas 数据帧转换为 Dask 数据帧后,Dask 将元组列表转换为来自 pandas 的列表,同时在 groupby 上应用函数。下面是一个可重现的小例子:
abc = [[("a", 1), ("b", 2)], [("a", 1), ("b", 2)], [("a", 1), ("b", 2)], [("a", 1), ("b", 2)]]
mnp = [1, 1, 2, 3]
pdf1 = pd.DataFrame()
pdf1["a"] = abc
pdf1["b"] = mnp
ddf = dd.from_pandas(pdf1, npartitions=2)
def apply_fun(grouped_df):
print(grouped_df)
pdf1.groupby(["b"]).apply(apply_fun) # pandas version
ddf.groupby(["b"]).apply(apply_fun, meta=pd.Series([], dtype=str)).compute() # dask version
pandas版产生
a b
0 [(a, 1), (b, 2)] 1
1 [(a, 1), (b, 2)] 1
a b
2 [(a, 1), (b, 2)] 2
a b
3 [(a, 1), (b, 2)] 3
dask 版本
a b
0 [[a, 1], [b, 2]] 1
1 [[a, 1], [b, 2]] 1
a b
2 [[a, 1], [b, 2]] 2
a b
3 [[a, 1], [b, 2]] 3
有人可以帮助如何将原始格式保留为元组列表吗?
元组/列表切换发生在聚合期间(可能是某个地方的
iter
),但如果应保留特定数据类型,则可以显式强加它:
def apply_fun(grouped_df):
grouped_df["a"] = grouped_df["a"].apply(lambda x: [tuple(y) for y in x])
print(grouped_df)
# a b
# 0 [(a, 1), (b, 2)] 1
# 1 [(a, 1), (b, 2)] 1
# a b
# 2 [(a, 1), (b, 2)] 2
# a b
# 3 [(a, 1), (b, 2)] 3