2016-03-15 62 views
1

enter image description here如何根据python中的特定名称拆分数据框中的行?

我有下面结构的数据帧:

Bronze Age    0-30 31-60 60+ 
Country State Region   
A   X  R1  100 200  300 
B   Y  R2  150 220  140 
Silver Age    0-30 31-60 60+ 
Country State Region   
A  X  R1  150  220  167 
B  Y  R2  735  398  239 
Gold Age    0-30 31-60 60+ 
Country State Region   
A  X  R1  232 564  878 
B  Y  R2  112 233  543 
Platinum Age   0-30 31-60 60+ 
Country State Region   
A  X  R1  646 756  323 
B  Y  R2  434 877  978 

现在,我想给每个像铜,银,金,铂类分离成4个不同的dataframes。

样品青铜输出是:

Country State Region Age Count  
A   X  R1  0-30 100 
A   X  R1  31-60 200 
A   X  R1  60+  300 
B   Y  R2  0-30 150 
B   Y  R2  31-60 220 
B   Y  R2  60+  140 

我是新来的蟒蛇,无法获得关于如何做这样的行分裂的任何想法。

+0

你能分享大熊猫据帧可执行形式? – roadrunner66

+0

可以请你分享适当的数据帧...我不理解你的df结构 –

+0

请检查上面链接中的df图像。 – marupav

回答

1

为distiguish ages创建新列,然后通过正向填充方法,通过isinfillnanames使用mask

df['ages'] = df.iloc[:,0] 

ages = ['Bronze','Silver','Gold', 'Platinum'] 
mask = df.ages.isin(ages) 

df['ages'] = df.ages[mask] 
df['ages'] = df.ages.fillna(method='ffill') 
#print df 

#print df.iloc[1,:].fillna(df.iloc[0,:]) 
df.columns = df.iloc[1,:].fillna(df.iloc[0,:]) 

df = df.dropna().rename(columns={'Bronze':'Ages'}) 

print df 
1 Country State Region 0-30 31-60 60+  Ages 
2  A  X  R1 100 200 300 Bronze 
3  B  Y  R2 150 220 140 Bronze 
6  A  X  R1 150 220 167 Silver 
7  B  Y  R2 735 398 239 Silver 
10  A  X  R1 232 564 878  Gold 
11  B  Y  R2 112 233 543  Gold 
14  A  X  R1 646 756 323 Platinum 
15  B  Y  R2 434 877 978 Platinum 

使用melt重塑,然后排序数据帧由Country列与函数sort_values

df = pd.melt(df, 
      id_vars=['Country','State','Region', 'Ages'], 
      var_name='Age', 
      value_name='Count') 

df = df.sort_values(by=['Country', 'Age']) 

print df 
    Country State Region  Ages Age Count 
0  A  X  R1 Bronze 0-30 100 
2  A  X  R1 Silver 0-30 150 
4  A  X  R1  Gold 0-30 232 
6  A  X  R1 Platinum 0-30 646 
8  A  X  R1 Bronze 31-60 200 
10  A  X  R1 Silver 31-60 220 
12  A  X  R1  Gold 31-60 564 
14  A  X  R1 Platinum 31-60 756 
16  A  X  R1 Bronze 60+ 300 
18  A  X  R1 Silver 60+ 167 
20  A  X  R1  Gold 60+ 878 
22  A  X  R1 Platinum 60+ 323 
1  B  Y  R2 Bronze 0-30 150 
3  B  Y  R2 Silver 0-30 735 
5  B  Y  R2  Gold 0-30 112 
7  B  Y  R2 Platinum 0-30 434 
9  B  Y  R2 Bronze 31-60 220 
11  B  Y  R2 Silver 31-60 398 
13  B  Y  R2  Gold 31-60 233 
15  B  Y  R2 Platinum 31-60 877 
17  B  Y  R2 Bronze 60+ 140 
19  B  Y  R2 Silver 60+ 239 
21  B  Y  R2  Gold 60+ 543 
23  B  Y  R2 Platinum 60+ 978 

创建字典d存储DataFrames并填写:

d = {} 

for age in ages: 
    #print df[df.Ages == age] 
    d.update({age : df[df.Ages == age].drop('Ages', axis=1).reset_index(drop=True)}) 

print d['Bronze'] 
    Country State Region Age Count 
0  A  X  R1 0-30 100 
1  A  X  R1 31-60 200 
2  A  X  R1 60+ 300 
3  B  Y  R2 0-30 150 
4  B  Y  R2 31-60 220 
5  B  Y  R2 60+ 140 
print d['Silver'] 
    Country State Region Age Count 
0  A  X  R1 0-30 150 
1  A  X  R1 31-60 220 
2  A  X  R1 60+ 167 
3  B  Y  R2 0-30 735 
4  B  Y  R2 31-60 398 
5  B  Y  R2 60+ 239 
+0

谢谢jezrael.That工作。同时我也在其他方法上工作。可以按照我最初在最后一个字典中说的d''Bronze'的顺序来提供年龄组吗? – marupav

+0

编辑的答案,请检查。 – jezrael

+0

这就是我的要求。再次感谢:) – marupav

0

嗨,这可能会工作,没有测试。根据多重索引选择reset_index并融化。

dfBronze = df.ix["Bronze"].reset_index() 
dfBronze = dfBronze.melt(id_vars=['Country','State','Region'], value_vars=['Age']) 
+0

嗨,我在这里得到了一个关键错误。要清楚,所有这些数据都没有标题。他们只是多列中的内容。对于青铜df,我需要Silver.Silver之前的所有信息应该进入不同的df和与其他人一样。 – marupav

+0

你可以把你的代码生成数据帧 – iboboboru

+0

请检查上面链接中的df图像。 – marupav

相关问题