Pandas - 根据值插入行

时间:2017-06-12 23:05:12

标签: python pandas

我的原始数据框:

    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>

2 个答案:

答案 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个重复行。然后按sitetype排序,以便保留原始订单。

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