说我有一个简单的数据框:
student_id name age address
student1 a 12 us
student2 b 13 us
student3 c 13 uk
如果有条件,我想将年龄和地址的值附加到名称上,如果年龄为13,可以说将年龄和地址连接到名称上,就像这样:
student_id name age address
student1 a 12 us
student2 b 13 us
student3 c 13 uk
b-13-us
c-13-uk
如何将其实现到当前数据框?
答案 0 :(得分:3)
先用DataFrame.loc
过滤列,再用Series.eq
屏蔽,然后转换为字符串并连接在一起:
s = df.loc[df['age'].eq(13), ['name','age','address']].astype(str).agg('-'.join, 1)
然后用Series.to_frame
创建一列DataFrame
,如果要将所有列替换为空字符串,请添加DataFrame.reindex
(现在age
列也已混合-数字和字符串)并通过DataFrame.append
df1 = s.to_frame('name').reindex(df.columns, fill_value='', axis=1)
df = df.append(df1, sort=False, ignore_index=True)
print (df)
student_id name age address
0 student1 a 12 us
1 student2 b 13 us
2 student3 c 13 uk
3 b-13-us
4 c-13-uk
对于新格式,将分别处理每列:
df0 = df[df['age'].eq(13)].copy()
s = df0['name'] + ' (' + df0['age'].astype(str) + '-' + df0['address'] + ')'
df1 = s.to_frame('name').reindex(df.columns, fill_value='', axis=1)
df = df.append(df1, sort=False, ignore_index=True)
print (df)
student_id name age address
0 student1 a 12 us
1 student2 b 13 us
2 student3 c 13 uk
3 b (13-us)
4 c (13-uk)