当前,我正在尝试将一列转换为几列,并相应地对其内容求和,即整理数据帧的长度。例如,我们有一个名为year
的列,其值从2014年到2016年。其次,我们还有一个列sales
的额度。我想要的是将year
转换为2014
到2015
,2016
和sales
中,并加上与该特定年份相对应的sales
。可以删除原始的2014
或显示所有年份的总销售额。
使用Pandas的groupby()函数,agg()和transform(),我试图提出一种解决方案,没有普遍的first,second。也就是说,我似乎无法找到创建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
答案 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`