2017-06-12 85 views
0

我的原始数据帧:熊猫 - 插入行基于退值

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 [ '类型'] == 's',分配df ['name'] == 1并插入三个值为2,3和全部的行。

回答

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 
0

可以为's'行的重复的新行添加到您的数据帧,然后填充'name'列与值你想要的:

先加3个重复行的每一行谁的type's'。然后按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