按多个列分组并在for循环中返回一列的和

2024-09-29 23:15:01 发布

您现在位置:Python中文网/ 问答频道 /正文

  • 我有一个有很多列的csv文件。对于这里的示例,我总共使用了6列:

enter image description here

  • 我不太熟悉熊猫。

  • 我的主要目标是在烘焙当前文件(如上所示)中的数据之后创建一个新的csv文件。我想分步做的事情:

01)聚合数据:首先,按ID对行进行分组,并具有:

  1. 每个ID的最早开始日期

  2. 每个ID的最新结束日期

  3. 每个ID的值之和

02)按ID对行进行分组,并对我选择的任意列进行分组:

  1. 每个ID的最早开始日期

  2. 每个ID的最新结束日期

  3. 每个ID的值之和

  4. random 1random 2值与其他数据(分组)一起呈现

在不分组数据的情况下,我能够得到最早的开始日期、最晚的结束日期以及值的总和。代码如下(对于1个ID):

#Get the first Start Date
minStartDate = df.loc[ df['ID'] == 56886, 'Start Date'].min()

#Get the last End Date
maxEndDate = df.loc[ df['ID'] == 56886, 'End Date'].max()

#Get the value sum
sumValue = df.loc[ df['ID'] == 56886, 'Value'].sum()

然后我把它按所有ID分组:

^{pr2}$

打印后,我得到了maxEndDateminStartDatesumValueID的正确值。问题是它只显示一个ID的值(文件中的最后一个):

在本例中,这是预期的输出(忽略随机列之后):

enter image description here

所以,我把剧本改成:

minStartDate = {}
maxEndDate = {}
summyValue = {}
Key = {}
ID = df[' ID']

for i in ID:
    Key[i] = df.loc[ df['ID'] == i, 'ID']
    #Get the first Start Date
    minStartDate[i] = df.loc[ df['ID'] == i, 'Start Date'].min()
    #Get the last End Date
    maxEndDate[i] = df.loc[ df['ID'] == i, 'End Date'].max()
    #Get the Value sum
    summyValue[i] = df.loc[ df['ID'] == i, 'Value'].sum()



print(summyValue,minStartDate,maxEndDate)

在候机厅我看到了这个:

enter image description here

考虑到最终预期产出为:

enter image description here

我该怎么玩弄场地的组合呢?在for循环中,我猜我应该包括Random 1Random 2列(创建键)。另外,为了在新的CSV文件中导出所有内容,for循环的最佳输出是什么?在


Tags: 文件the数据iddfgetdatevalue
1条回答
网友
1楼 · 发布于 2024-09-29 23:15:01

如果你想用最大重复值填充random 1和random 2,你可以用你自己的函数,例如

df = pd.DataFrame({
    'id': [1,1,1,1,2,2,2],
    'r1': ['x','y','y','y','x','x','x'],
    'r2': ['t','I','t','t','c','c','c']
})

def max_rep(x):
    return x.value_counts().idxmax()

ndf = df.groupby('id',as_index=False).agg({'r1': max_rep,'r2':max_rep})

或者用lambda,如果你想在一条线上

^{pr2}$

输出:

  id r1 r2
0   1  y  t
1   2  x  c

正如Jon所说,你可以使用agg在一行中完成所有步骤,即

df.groupby('ID',as_index=False).agg('Start Date': 'min', 'End Date': 'max', 'Value': 'sum', \
                 'Random 1':max_rep,'Random 2':max_rep})

如果您希望与random1和random2一起分组,则可以使用

df.groupby(['ID','Random 1','Random 2'],as_index=False).agg('Start Date': 'min', 'End Date': 'max', 'Value': 'sum')

相关问题 更多 >

    热门问题