[英]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.split
與expand=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.