[英]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
,然后用mask
的isin
和fillna
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.