Dask数据帧 - 根据分隔符将列拆分为多行

ltt*_*ltt 5 python performance pandas dask

使用dask数据框将列拆分成多行的有效方法是什么?例如,假设我有一个csv文件,我使用dask读取它来生成以下dask数据帧:

id var1 var2
1  A    Z,Y
2  B    X
3  C    W,U,V
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

id var1 var2
1  A    Z
1  A    Y
2  B    X
3  C    W
3  C    U
3  C    V
Run Code Online (Sandbox Code Playgroud)

我已经查看了Split(爆炸)pandas数据帧字符串条目的答案,以分隔行pandas:如何将列中的文本拆分成多行?.

我尝试应用/sf/answers/1198188351/中给出的答案, 但是dask似乎不接受str.split中的expand关键字.

我也尝试应用/sf/answers/2831480851/中建议的向量化方法,但后来发现np.repeat没有在带有整数数组的dask中实现(https://github.com/dask/ dask/issues/2946).

我在熊猫中尝试了一些其他的方法,但它们真的很慢 - 可能用dask更快但我想首先检查一下是否有人用任何特定的方法取得了成功.我正在使用超过1000万行和10列(字符串数据)的数据集.分成行后,它可能会变成大约5000万行.

感谢您对此进行调查!我很感激.

mdu*_*ant 7

Dask允许您直接将pandas用于行(如此)的操作,或者可以一次应用一个分区.请记住,Dask数据框由一组Pandas数据帧组成.

对于Pandas案例,您可以根据链接的问题执行此操作:

df = pd.DataFrame([["A", "Z,Y"], ["B", "X"], ["C", "W,U,V"]], 
    columns=['var1', 'var2'])
df.drop('var2', axis=1).join(
    df.var2.str.split(',', expand=True).stack().reset_index(drop=True, level=1).rename('var2'))
Run Code Online (Sandbox Code Playgroud)

因此对于Dask,您可以通过相同的方法应用map_partitions,因为每一行都独立于所有其他行.如果传递的函数是单独写出来的,而不是作为lambda,这可能看起来更清晰:

d = dd.from_pandas(df, 2)
d.map_partitions(
    lambda df: df.drop('var2', axis=1).join(
        df.var2.str.split(',', expand=True).stack().reset_index(drop=True, level=1).rename('var2')))
Run Code Online (Sandbox Code Playgroud)

如果您这样做.compute(),您将得到与上面的Pandas案例完全相同的结果.有可能你会不会想你的计算数据框大规模在一个去这样的,但在其上进行进一步的处理.