熊猫groupby并汇总到新列

时间:2019-08-16 09:47:33

标签: python pandas pandas-groupby

当前,我正在尝试将一列转换为几列,并相应地对其内容求和,即整理数据帧的长度。例如,我们有一个名为year的列,其值从2014年到2016年。其次,我们还有一个列sales的额度。我想要的是将year转换为201420152016sales中,并加上与该特定年份相对应的sales。可以删除原始的2014或显示所有年份的总销售额。

使用Pandas的groupby()函数,agg()和transform(),我试图提出一种解决方案,没有普遍的firstsecond。也就是说,我似乎无法找到创建df = pd.DataFrame({'CustomerId':[1,1,1,2,2,2,3,3,3,4,4,4,5,5,5], 'CustomerName': ['McNulty','McNulty','McNulty', 'Bunk','Bunk','Bunk', 'Joe','Joe','Joe', 'Rawls','Rawls','Rawls', 'Davis','Davis','Davis'], 'Sales':np.random.randint(1000,1500,15), 'Year':[2014,2015,2016,2014,2015,2016,2014,2015,2016, 2014,2015,2016,2014,2015,2016]}) 等列的解决方法。

假设以下数据框:

CustomerId CustomerName Sales 2014 2015 2016
1          McNulty      3300  1050 1050 1200
2          Bunk         3500  1100 1200 1200
3          Joe          3900  1300 1300 1300
4          Rawls        3500  1000 1000 1500
5          Davis        3800  1600 1100 1100

预期输出应如下:

df:
   a  b  c
0  1  2  3

df:
   a  y  c
0  4  5  6

2 个答案:

答案 0 :(得分:2)

您可以使用DataFrame.pivot_table

onMapLongPress = (latitude, longitude) => {
    const { markers } = this.state;
    markers.push({ title: 'Title', coordinates: { latitude, longitude } });
    Alert.alert('Added!');
  };

  render() {
    const { markers } = this.state;
    return (
      <MapView
        style={{ flex: 1 }}
        initialRegion={{
          latitude: 53.8878349,
          longitude: 27.5428332,
          latitudeDelta: 0.0122,
          longitudeDelta: 0.0121,
        }}
        onLongPress={this.onMapLongPress(???, ???)}
      >
        {markers.map(marker => (
          <MapView.Marker
            coordinate={marker.coordinates}
            title={marker.title}
          />
        ))}
      </MapView>
    );
  }

[出]

df.pivot_table(index=['CustomerId', 'CustomerName'],
               columns=['Year'],
               values='Sales',
               margins=True,
               margins_name='Sales',
               aggfunc='sum').reset_index().iloc[:-1]

答案 1 :(得分:2)

使用pivot_table并展平多索引列,最后在sum上计算axis=1

piv = df.pivot_table(index=['CustomerId', 'CustomerName'], columns='Year').reset_index()

piv.columns = [f'{c1}_{c2}'.strip('_') for c1, c2 in piv.columns]

piv['Sales'] = piv.filter(like='Sales').sum(axis=1)

输出

   CustomerId CustomerName  Sales_2014  Sales_2015  Sales_2016  Sales
0           1      McNulty        1144        1007        1108   3259
1           2         Bunk        1146        1451        1169   3766
2           3          Joe        1455        1070        1351   3876
3           4        Rawls        1263        1004        1422   3689
4           5        Davis        1428        1431        1399   4258`