根据标签划分两个行值,并创建一个新列以填充计算值

时间:2019-04-28 17:06:53

标签: pandas

Python的新手,正在寻求帮助。

我想将值分成两个不同的行(同一列的一部分),然后插入具有计算值的新列

    City              2017-18                     Item
0       Boston              100                       Primary
1       Boston              200                       Secondary
2       Boston              300                       Tertiary
3       Boston              400                       Nat'l average
4       Chicago             500                       Primary
5       Chicago             600                       Secondary
6       Chicago             700                       Tertiary
7       Chicago             800                       Nat'l average

在上述数据框上,我试图将城市的主要,中学和第三级值分别除以该城市的Nat'l平均值。结果答案将填充在同一Dataframe的新列部分中。计算后,需要删除标签为“平均水平”的行。

感谢您的帮助...

         City         2014-15         Item             New_column
0       Boston         100           Primary          100/400
1       Boston         200           Secondary        200/400
2       Boston         300           Tertiary         300/400
3       Chicago        500           Primary          500/800 
4       Chicago        600           Secondary        600/800
5       Chicago        700           Tertiary         700/800

1 个答案:

答案 0 :(得分:3)

如果平均值始终是每个组的最后一个值,则将列除以GroupBy.transformGroupBy.last创建的Series

df['new'] = df['2017-18'].div(df.groupby('City')['2017-18'].transform('last'))

如果不首先使用average过滤值,然后除以Series.map ing Series:

s = df[df['Item'] == "Nat'l average"].set_index('City')['2017-18']
df['new'] = df['2017-18'].div(df['City'].map(s))

最后用boolean indexing过滤出行:

df = df[df['Item'] != "Nat'l average"]
print (df)
      City  2017-18       Item    new
0   Boston      100    Primary  0.250
1   Boston      200  Secondary  0.500
2   Boston      300   Tertiary  0.750
4  Chicago      500    Primary  0.625
5  Chicago      600  Secondary  0.750
6  Chicago      700   Tertiary  0.875

详细信息:

print (df['City'].map(s))
0    400
1    400
2    400
3    400
4    800
5    800
6    800
7    800
Name: City, dtype: int64