繁体   English   中英

将 Dask Dataframe 中的列拆分为 n 列

[英]Split column in a Dask Dataframe into n number of columns

Dask Dataframe 的一列中,我有这样的字符串:

column_name_1 column_name_2
a^b^c j
e^f^g k^l
h^i

我需要将这些字符串拆分成同一数据框中的列,就像这样

column_name_1 column_name_2 column_name_1_1 column_name_1_2 column_name_1_3 column_name_2_1 column_name_2_2
a^b^c j 一种 b c j
e^f^g k^l 电子 F G k
h^i H 一世

如果事先不知道数据中分隔符的出现次数,我无法弄清楚如何执行此操作。 此外,Dataframe 中有数十列要单独保留,因此我需要能够指定像这样拆分哪些列。

我的最大努力要么包括类似

df[["column_name_1_1","column_name_1_2 ","column_name_1_3"]] = df["column_name_1"].str.split('^',n=2, expand=True)

但它失败了

ValueError:计算数据中的列与提供的元数据中的列不匹配

这里有 2 个解决方案,没有stack但对选定的列名有循环:

cols = ['column_name_1','column_name_2']
for c in cols:
    df = df.join(df[c].str.split('^',n=2, expand=True).add_prefix(f'{c}_').fillna(''))

print (df)
  column_name_1 column_name_2 column_name_1_0 column_name_1_1 column_name_1_2  \
0         a^b^c             j               a               b               c   
1         e^f^g           k^l               e               f               g   
2           h^i             m               h               i                   

  column_name_2_0 column_name_2_1  
0               j                  
1               k               l  
2               m                  

或者修改其他方案:

cols = ['column_name_1','column_name_2']
dfs = [df[c].str.split('^',n=2, expand=True).add_prefix(f'{c}_').fillna('') for c in cols]
df = pd.concat([df] + dfs, axis=1)
print (df)
  column_name_1 column_name_2 column_name_1_0 column_name_1_1 column_name_1_2  \
0         a^b^c             j               a               b               c   
1         e^f^g           k^l               e               f               g   
2           h^i             m               h               i                   

  column_name_2_0 column_name_2_1  
0               j                  
1               k               l  
2               m                  

不幸的是,Dask 尚不支持将dask.dataframe.Series.str.splitexpand=True和未知数量的拆分一起使用,以下返回NotImplementedError

import dask.dataframe as dd
import pandas as pd

ddf = dd.from_pandas(
    pd.DataFrame({
        'column_name_1': ['a^b^c', 'e^f^g', 'h^i'], 'column_name_2': ['j', 'k^l', 'm']
    }), npartitions=2
)

# returns NotImplementedError
ddf['column_name_1'].str.split('^', expand=True).compute()

通常当 pandas 等价物尚未在map_partitions中实现时,可以使用 map_partitions 在每个 DataFrame 分区上应用 Python function。 然而,在这种情况下,Dask 仍然需要知道预期有多少列才能懒惰地生成 Dask DataFrame,如meta参数所提供的那样。 这使得使用 Dask 完成这项任务具有挑战性。 相关地,发生ValueError是因为column_name_2只需要 1 次拆分,并返回具有 2 列的 Dask DataFrame,但 Dask 期望具有 3 列的 DataFrame。

如果提前知道拆分次数,这是一种解决方案(根据@Fontanka16 的回答构建):

import dask.dataframe as dd
import pandas as pd

ddf = dd.from_pandas(
    pd.DataFrame({
        'column_name_1': ['a^b^c', 'e^f^g', 'h^i'], 'column_name_2': ['j', 'k^l', 'm']
    }), npartitions=2
)

ddf_list = []
num_split_dict = {'column_name_1': 2, 'column_name_2': 1}
for col, num_splits in num_split_dict.items():
    split_df = ddf[col].str.split('^', n=num_splits, expand=True).add_prefix(f'{col}_')
    ddf_list.append(split_df)
new_ddf = dd.concat([ddf] + ddf_list, axis=1)
new_ddf.compute()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM