2017-06-12 75 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