熊猫聚合除特定列中的特定值以外的数据

时间:2019-02-18 07:33:05

标签: python-3.x pandas dataframe

我在pandas数据框python中有这样的数据

X_train_cleaned = X_train[np.where(y_pred_train == 1, True, False)]

我要生成的oputput是

enter image description here

如何使用python pandas数据框生成这些结果。我想包括所有类型列的 Y 值,并且不想汇总它们。

1 个答案:

答案 0 :(得分:1)

首先按boolean indexing过滤值,汇总并追加过滤出的行,最后进行排序:

mask = df['Type'] == 'Y'
df1 = (df[~mask].groupby('Type', as_index=False)
                .agg({'ID':'first', 'Value':'sum'})
                .append(df[mask])
                .sort_values('ID'))
print (df1)
   ID Type  Value
0   1    X      5
2   3    Y      2
3   4    Y      9
1   5    Z     11

如果希望1列的范围为length of dataID

mask = df['Type'] == 'Y'
df1 = (df[~mask].groupby('Type', as_index=False)
                .agg({'ID':'first', 'Value':'sum'})
                .append(df[mask])
                .sort_values('ID')
                .assign(ID = lambda x:  np.arange(1, len(x) + 1)))
print (df1)
   ID Type  Value
0   1    X      5
2   2    Y      2
3   3    Y      9
1   4    Z     11

另一种想法是为仅Y行的唯一值创建帮助器列,并按两列进行汇总:

mask = df['Type'] == 'Y'
df['g'] = np.where(mask, mask.cumsum() + 1, 0)

df1 = (df.groupby(['Type','g'], as_index=False)
        .agg({'ID':'first', 'Value':'sum'})
        .drop('g', axis=1)[['ID','Type','Value']])

print (df1)
   ID Type  Value
0   1    X      5
1   3    Y      2
2   4    Y      9
3   5    Z     11

与系列g相似,则不需要drop

mask = df['Type'] == 'Y'
g = np.where(mask, mask.cumsum() + 1, 0)
df1 = (df.groupby(['Type',g], as_index=False)
        .agg({'ID':'first', 'Value':'sum'})[['ID','Type','Value']])