我的原始数据框:
site code type name
0 a code_foo s
1 a code_foo t
2 b code_foo s
3 b code_foo t
期望的结果:
site code type name
0 a code_foo s 1
1 a code_foo s 2
2 a code_foo s 3
3 a code_foo s All
4 a code_foo t
5 b code_foo s 1
6 b code_foo s 2
7 b code_foo s 3
8 b code_foo s All
9 b code_foo t
我基本上想将数据框修改为:df ['type'] =='s',分配df ['name'] == 1并再插入三行,其值为2,3和All。 / p>
答案 0 :(得分:0)
您可以先构建一个类型名称df,然后将其连接到原始DF并按站点对其进行排序。
df2=pd.DataFrame({'name': {0: 1, 1: 2, 2: 3, 3: 'all'},
'type': {0: 's', 1: 's', 2: 's', 3: 's'}})
pd.merge(df[['site','code','type']],df2,on='type',how='outer')
.sort_values(by=['site','name'])
.fillna('')
Out[43]:
site code type name
0 a code_foo s 1
1 a code_foo s 2
2 a code_foo s 3
3 a code_foo s all
8 a code_foo t
4 b code_foo s 1
5 b code_foo s 2
6 b code_foo s 3
7 b code_foo s all
9 b code_foo t
答案 1 :(得分:0)
您可以将新行添加到数据框中,作为's'
行的副本,然后使用您想要的值填充'name'
列:
首先为type
值为's'
的每一行添加3个重复行。然后按site
和type
排序,以便保留原始订单。
df2 = df.append([df[df.type == 's']]*3, ignore_index=True).sort_values(['site', 'type'])
将name
列中的所有值设置为空字符串(我们将在下一步中覆盖's'
行的此值)
df2['name'] = ''
创建一个列表[1, 2, 3, 'All']
重复n次,其中n是原始's'
行的数量。
name_vals = [1, 2, 3, 'All']*len(df.loc[df2.type == 's'])
将此列表指定为name
列中所有属于's'
的所有行的值。由于它们已经排序,因此将值放在您想要的位置。
df2.loc[df2.type == 's', 'name'] = name_vals
此时索引会有些混乱,所以如果你想要你可以重置它:
df2.reset_index(drop=True, inplace=True)
,新数据框如下所示:
site code type name
0 a code_foo s 1
1 a code_foo s 2
2 a code_foo s 3
3 a code_foo s All
4 a code_foo t
5 b code_foo s 1
6 b code_foo s 2
7 b code_foo s 3
8 b code_foo s All
9 b code_foo t