有一个类似于我的问题,但要求是用“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表示学生注册资格的科目数。
双管符号'||'是三组资格的分隔符
我想做以下事情:
我想创建一个包含IAGSTNO的新数据框和另外三列(Qual_1,Qual_2和Qual_3),其中字符串代表三个限定属性 - STNO的完整数据集必须在此df中
然后,我想创建第三个数据框,将三个单独的Qual列拆分为各自的属性列 - 使用IAGSTNO的完整数据集必须在此df中。
即使只有一个指针也会非常有用。
提前致谢,
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,所有双引号和单引号以及[]的结果看起来很可疑。
感谢目前为止提供的帮助
答案 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