将python中的单个列拆分为多个单独的列

时间:2018-02-21 12:49:44

标签: python pandas dataframe

有一个类似于我的问题,但要求是用“R”语言来做。我对R的知识还处于幼儿园阶段,我无法将答案从R翻译成Python。所以这里。

我有一个包含两列的数据框 - IAGSTNO和Quals:

IAGSTNO   QUALS
215299035 204212 BC:0 OT:VF #Subj:10 ||DI0430 BC:0 OT:VF #Subj:0
216034361 208086 BC:1 OT:VF #Subj:2 ||DI0800 BC:1 OT:VF #Subj:5
216138396 208382 BC:1 OT:VF #Subj:2 ||208082 BC:1 OT:WI #Subj:1
216139376 208383 BC:1 OT:VF #Subj:0 ||208388 BC:1 OT:VF #Subj:4
216149959 204179 BC:0 OT:HP #Subj:0 ||DI0420 BC:0 OT:HP #Subj:7
217028330 DI0800 BC:1 OT:HF #Subj:0 ||DI0824 BC:1 OT:HF #Subj:4 ||DI0825 BC:1 OT:HF #Subj:3

这是以这种格式专门提取的,以方便人们观众使用。

数据框是关于注册多个资格的学生。

QUALS列最多包含三个资格分组,格式如下: qual_code BC:1 OT:VF #Subj:3 ||

qual_code是资格的代码

BC:1表示学期

OT:VF表示学生是全职/兼职

hash(#)Subj:3表示学生注册资格的科目数。

双管符号'||'是三组资格的分隔符

我想做以下事情:

  1. 我想创建一个包含IAGSTNO的新数据框和另外三列(Qual_1,Qual_2和Qual_3),其中字符串代表三个限定属性 - STNO的完整数据集必须在此df中

  2. 然后,我想创建第三个数据框,将三个单独的Qual列拆分为各自的属性列 - 使用IAGSTNO的完整数据集必须在此df中。

  3. 即使只有一个指针也会非常有用。

    提前致谢,

    Phlip

    预期结果:

    Dataframe2应如下所示:

    Stno        Qual 1                          Qual 2                              Qual 3
    217028330   DI0800 BC:1 OT: HF #Subj: 0     DI0824 BC:1 OT: HF #Subj: 2         DI0825 BC:1 OT: HF #Subj: 3
    20522461    208383 BC:1 OT: VF #Subj: 2     208083 BC:1 OT: WI #Subj: 1     
    206060165   208283 BC:1 OT: HF #Subj: 0     208NDP BC:1 OT: HF #Subj: 1     
    207046409   208483 BC:1 OT: VF #Subj: 2     208083 BC:1 OT: WI #Subj: 1     
    208039023   308030 BC:1 OT: VF #Subj: 2     208082 BC:1 OT: WI #Subj: 1     
    210076615   308109 BC:1 OT: VF #Subj: 4     208083 BC:1 OT: WI #Subj: 1     
    210082933   304004 BC:0 OT: VF #Subj: 10    304031 BC:0 OT: VF #Subj: 0     
    210118008   308004 BC:1 OT: VF #Subj: 4     208085 BC:1 OT: WI #Subj: 1     
    211112844   208282 BC:1 OT: VF #Subj: 6     DI0840 BC:1 OT: VF #Subj: 0     
    211125334   208483 BC:1 OT: VF #Subj: 0     308109 BC:1 OT: VF #Subj: 1     
    

    Dataframe3应如下所示:

    Stno        1_Qual  1_Bc    1_Ot    1_NumSubj   2_Qual  2_Bc    2_Ot    2_NumSubj   3_Qual  3_Bc    3_Ot    3_NumSubj
    217028330   DI0800  BC:1    OT: HF  #Subj: 0    DI0824  BC:1    OT: HF  #Subj: 2    DI0825  BC:1    OT: HF  #Subj: 3
    20522461    208383  BC:1    OT: VF  #Subj: 2    208083  BC:1    OT: WI  #Subj: 1                
    206060165   208283  BC:1    OT: HF  #Subj: 0    208NDP  BC:1    OT: HF  #Subj: 1                
    207046409   208483  BC:1    OT: VF  #Subj: 2    208083  BC:1    OT: WI  #Subj: 1                
    208039023   308030  BC:1    OT: VF  #Subj: 2    208082  BC:1    OT: WI  #Subj: 1                
    210076615   308109  BC:1    OT: VF  #Subj: 4    208083  BC:1    OT: WI  #Subj: 1                
    210082933   304004  BC:0    OT: VF  #Subj: 10   304031  BC:0    OT: VF  #Subj: 0                
    210118008   308004  BC:1    OT: VF  #Subj: 4    208085  BC:1    OT: WI  #Subj: 1                
    211112844   208282  BC:1    OT: VF  #Subj: 6    DI0840  BC:1    OT: VF  #Subj: 0                
    211125334   208483  BC:1    OT: VF  #Subj: 0    308109  BC:1    OT: VF  #Subj: 1
    

    我试过了“

    df2 = dataset.loc[:,'IAGSTNO'].to_frame()
    df2['Qual_1'], df2['Qual_2'], df2['Qual_3']= zip(*dataset['QUALS'].str.split(' ',2))
    print(df2.head())
    

    “这是一个建议的答案,但这导致了

         IAGSTNO  Qual_1 Qual_2                                     Qual_3
    0   20073240  206015   BC:1  OT:VF #Subj:0 ||206017 BC:1 OT:VF #Subj:3
    1   20522461  208383   BC:1  OT:VF #Subj:2 ||208083 BC:1 OT:WI #Subj:1
    2  206060165  208283   BC:1  OT:HF #Subj:0 ||208NDP BC:1 OT:HF #Subj:1
    3  207046409  208483   BC:1  OT:VF #Subj:2 ||208083 BC:1 OT:WI #Subj:1
    4  208039023  308030   BC:1  OT:VF #Subj:2 ||208082 BC:1 OT:WI #Subj:1
    

    如上所述,这不是我想要的。

    我从“Chen,Daniel Y .. Pandas for Everyone:Python数据分析(Addison-Wesley数据和分析系列)(Kindle Locations 4984-4987).Pearson Education.Kindle Edition。”:< / p>

    # get the variable column 
    # access the string methods 
    # and split the column based on a delimiter 
    variable_split = ebola_long.variable.str.split('_')
    

    ” 并将其更改为

    quals_split01 = pd.DataFrame(dataset.QUALS.str.split(' ||'))
    print(quals_split01.head())
    

    我已经包含了pd.DataFrame,因为我想使用

    将帧写入csv文件
    with open('studMultQual_split1.csv', 'a') as f:
        quals_split01.to_csv(f, line_terminator='\n', index=False, header=True)
    f.close()
    

    这给我以下内容:

    QUALS
    "['DI0800', 'BC:1', 'OT:HF', '#Subj:0', '||DI0824', 'BC:1', 'OT:HF', '#Subj:4', '||DI0825', 'BC:1', 'OT:HF', '#Subj:3']"
    "['206015', 'BC:1', 'OT:VF', '#Subj:0', '||206017', 'BC:1', 'OT:VF', '#Subj:3']"
    "['208383', 'BC:1', 'OT:VF', '#Subj:2', '||208083', 'BC:1', 'OT:WI', '#Subj:1']"
    "['208283', 'BC:1', 'OT:HF', '#Subj:0', '||208NDP', 'BC:1', 'OT:HF', '#Subj:1']"
    "['208483', 'BC:1', 'OT:VF', '#Subj:2', '||208083', 'BC:1', 'OT:WI', '#Subj:1']"
    "['308030', 'BC:1', 'OT:VF', '#Subj:2', '||208082', 'BC:1', 'OT:WI', '#Subj:1']"
    "['208282', 'BC:1', 'OT:VF', '#Subj:1', '||208082', 'BC:1', 'OT:WI', '#Subj:1']"
    "['308109', 'BC:1', 'OT:VF', '#Subj:4', '||208083', 'BC:1', 'OT:WI', '#Subj:1']"
    "['304004', 'BC:0', 'OT:VF', '#Subj:10', '||304031', 'BC:0', 'OT:VF', '#Subj:0']"
    

    单个列,但缺少IAGSTNO,所有双引号和单引号以及[]的结果看起来很可疑。

    感谢目前为止提供的帮助

1 个答案:

答案 0 :(得分:0)

这是正确的方向吗?

import pandas as pd
import io

s = '''\
IAGSTNO,QUALS
215299035,204212 BC:0 OT:VF #Subj:10 ||DI0430 BC:0 OT:VF #Subj:0
216034361,208086 BC:1 OT:VF #Subj:2 ||DI0800 BC:1 OT:VF #Subj:5
216138396,208382 BC:1 OT:VF #Subj:2 ||208082 BC:1 OT:WI #Subj:1
216139376,208383 BC:1 OT:VF #Subj:0 ||208388 BC:1 OT:VF #Subj:4
216149959,204179 BC:0 OT:HP #Subj:0 ||DI0420 BC:0 OT:HP #Subj:7
217028330,DI0800 BC:1 OT:HF #Subj:0 ||DI0824 BC:1 OT:HF #Subj:4'''

# Recreate the dataframe
df = pd.read_csv(io.StringIO(s))

# Create frame2 and add columns
df2 = df.loc[:,'IAGSTNO'].to_frame()
df2['Qual_1'], df2['Qual_2'], df2['Qual_3']= zip(*df['QUALS'].str.split(' ',2))

print(df2)

返回:

     IAGSTNO  Qual_1 Qual_2                                      Qual_3
0  215299035  204212   BC:0  OT:VF #Subj:10 ||DI0430 BC:0 OT:VF #Subj:0
1  216034361  208086   BC:1   OT:VF #Subj:2 ||DI0800 BC:1 OT:VF #Subj:5
2  216138396  208382   BC:1   OT:VF #Subj:2 ||208082 BC:1 OT:WI #Subj:1
3  216139376  208383   BC:1   OT:VF #Subj:0 ||208388 BC:1 OT:VF #Subj:4
4  216149959  204179   BC:0   OT:HP #Subj:0 ||DI0420 BC:0 OT:HP #Subj:7
5  217028330  DI0800   BC:1   OT:HF #Subj:0 ||DI0824 BC:1 OT:HF #Subj:4