当最后一个分隔符不存在时,熊猫按分隔符分隔

时间:2018-11-12 19:41:52

标签: python pandas

我正在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

1 个答案:

答案 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