簡體   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