我正在Pandas的帮助下以Python构建ETL流程。我正在尝试通过定界符“ _
”来划分一些平面文件,其中,在我要拆分的列中,有些行包含3个定界符,有些行包含4个定界符(作为附加详细信息,部分)。
在示例中,该列中包含3个定界符的文件,如果我添加第5列并使用n = 4,它会给我一个Columns must be same length as key
错误,因为只有3个定界符(如果我使用只有4列,并且n = 3,它可以工作,但不是我想要的)。
我该如何解决这个问题,当它发现额外的分隔符时,仍会将其拆分为一列,如果不是,则仅将该列保留为null或空白。我也想指定一个n值,因为我不希望它在每个定界符处都继续分裂。任何帮助都将是惊人的!
df[['column1','column2','column3','column4',
'column5 may or may not exisit']] = df['Column_to_split'].str.split('_',n=4,expand=True)
示例数据
0 Column_to_split nextcolumn nextcolumn nextcolumn nextcolumn
0 text_text_text text2 text3 text4 23
1 text_text_text text2 text3 text4 8
所需结果
0 Column_to_split Column_to_split1 Column_to_split2 Column_to_split3 Column_to_split4 nextcolumn nextcolumn nextcolumn nextcolumn
0 text_text_text text text text null text2 text3 text4 23
1 text_text_text text text text null text2 text3 text4 8
答案 0 :(得分:0)
也许我错过了一些东西;这种方法对您有用吗?
import pandas as pd
df = pd.DataFrame(["text1, text2, text3, text4", "text1, text2, text3, text4, text5"], columns=["column_name"])
print(df)
输出:
column_name
0 text1, text2, text3, text4
1 text1, text2, text3, text4, text5
将单列分为多列:
df_split = df["column_name"].str.split(",", expand=True)
print(df_split)
输出:
0 1 2 3 4
0 text1 text2 text3 text4 None
1 text1 text2 text3 text4 text5
此操作后,您可以重命名列。
df_split.rename(columns={0:"column1"}, inplace=True)
print(df_split)
输出:
column1 1 2 3 4
0 text1 text2 text3 text4 None
1 text1 text2 text3 text4 text5
在您发表评论后采用Alt方法:
df = pd.DataFrame([["text1, text2, text3, text4",
"text1, text2, text3, text4, text5"],
["text1, text2, text3, text4",
"text1, text2, text3, text4, text5"]],
columns=["column1", "column2"])
print(df)
list_of_dfs = []
for col in df.columns:
temp_df = df[col].str.split(",", expand=True)
print(temp_df)
list_of_dfs.append(temp_df)
split_df = pd.concat(list_of_dfs)
print(split_df)
示例输出:
0 1 2 3
0 text1 text2 text3 text4
1 text1 text2 text3 text4
0 1 2 3 4
0 text1 text2 text3 text4 text5
1 text1 text2 text3 text4 text5
0 1 2 3 4
0 text1 text2 text3 text4 NaN
1 text1 text2 text3 text4 NaN
0 text1 text2 text3 text4 text5
1 text1 text2 text3 text4 text5