从pandas dataframe中的特定行创建新列

时间:2017-10-25 21:48:34

标签: python pandas dataframe

我有一个csv文件,其中每一行代表一个属性,后跟可变数量的后续行,反映属性中的房间。我想创建一个列,对于每个属性,汇总每个房间的总建筑面积。数据的非结构化特性使得pandas难以实现。这是我目前的表格的一个例子:

id  ba  store_desc      floor_area
0   1   Toy Shop        NaN
1   2   Retail Zone A   29.42
2   2   Retail Zone B   31.29
3   1   Grocery Store   NaN
4   2   Retail Zone A   68.00
5   2   Outside Garden  83.50
6   2   Office          7.30

以下是我要创建的表格:

id  ba  store_desc      floor_area   gross_floor_area
0   1   Toy Shop        NaN          60.71
3   1   Grocery Store   NaN          158.8

有没有人对如何实现这个结果有任何指示?我完全迷失了。

萨姆

2 个答案:

答案 0 :(得分:3)

IIUC

df1=df[df['floor_area'].isnull()]

df1['gross_floor_area']=df.groupby(df['floor_area'].isnull().cumsum())['floor_area'].sum().values

df1
Out[463]: 
   id  ba    store_desc  floor_area  gross_floor_area
0   0   1       ToyShop         NaN             60.71
3   3   1  GroceryStore         NaN            158.80

答案 1 :(得分:1)

首先创建一个名为category的临时列,然后我将其转发,按该列分组以获取总和,然后将其映射回相关的store_desc值。

df['category'] = df[df.floor_area.isnull()]['store_desc']

df['category'].fillna(method='ffill',inplace=True)

df['gross_floor_area'] = df.store_desc.map(df.groupby('category').sum().floor_area)

df.drop('category',axis=1,inplace=True)

df[df.gross_floor_area.notnull()]