Dask 将元组列表转换为来自 pandas 的列表列表

问题描述 投票:0回答:1

我最近遇到一个问题,即在将 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

有人可以帮助如何将原始格式保留为元组列表吗?

python pandas dask dask-dataframe
1个回答
0
投票

元组/列表切换发生在聚合期间(可能是某个地方的

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
© www.soinside.com 2019 - 2024. All rights reserved.