繁体   English   中英

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

[英]How to split rows in dataframe based on specific names in 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 个不同的数据框。

青铜输出的样本是:

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

我是 python 的新手,不知道如何进行这种行拆分。

创建distiguish新列ages ,然后用maskisinfillna names向前填充方法:

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进行整形,然后使用函数sort_values按列Country对 DataFrame 进行排序:

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

创建用于存储DataFrames字典d并填充它:

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

嗨,这可能有效,未经测试。 根据多索引、reset_index 和melt 进行选择。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM