[英]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.