我正在使用 Python3 和 Pandas(我不太熟悉)。
我的主要目标是在当前文件中烘焙数据后创建一个新的 csv 文件(如上所示)。我想分步骤做的事情:
01) 聚合数据:首先,将每个 ID 的行分组并具有:
每个ID的最早开始日期
每个ID的最新结束日期
每个ID的值的总和
02)将每个ID的行和我选择的任何随机列分组:
每个ID的最早开始日期
每个ID的最新结束日期
每个ID的值的总和
与其余数据一起显示Random1和Random2值(分组)
无需对数据进行分组,我就能获得最早的Start Date、最新的End Date和Value的 SUM 。代码如下(对于 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 将其分组:
for i in ID:
#Get the first Start Date
minStartDate = df.loc[ df['ID'] == i, 'Start Date'].min()
#Get the last End Date
maxEndDate = df.loc[ df['ID'] == i, 'End Date'].max()
#Get the Value sum
sumValue = df.loc[ df['ID'] == i, 'Value'].sum()
print(maxEndDate)
打印后我得到了maxEndDate、minStartDate、sumValue、ID的正确值。问题是它只显示一个ID(文件中的最后一个)的值:
在这种情况下,这是预期的输出(在忽略 Random 列之后):
因此,我已将脚本更改为:
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)
在终端我得到这个:
考虑到最终的预期输出为:
我应该如何玩转这些领域的组合?在 for 循环中,我猜我应该包括Random 1和Random 2列(密钥创建)。此外,为了将所有内容导出到新的 CSV 文件中,for 循环的最佳输出是什么?
如果你想用最大重复值填充随机 1 和随机 2,那么你可以使用 agg 和你自己的函数,即
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
ndf = df.groupby('id',as_index=False).agg({'r1': lambda x: x.value_counts().idxmax(),'r2': lambda x: x.value_counts().idxmax()})
输出 :
id r1 r2 0 1 yt 1 2 xc
正如乔恩评论的那样,您可以使用 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')
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句