【发布时间】:2018-04-02 10:48:31
【问题描述】:
- 我有一个包含许多列的 csv 文件。对于此处的示例,我总共使用了 6 列:
我正在使用 Python3 和 Pandas(我不太熟悉)。
我的主要目标是在烘焙当前文件中的数据后创建一个新的 csv 文件(如上所示)。我想分步做的:
01) 聚合数据:首先,按 ID 对行进行分组并具有:
每个ID
的最早开始日期
每个ID
的最新结束日期
每个 ID
的值的总和
02) 对每个 ID 的行和我选择并拥有的任何随机列进行分组:
每个ID
的最早开始日期
每个ID
的最新结束日期
每个 ID
的值的总和
在其余数据旁边显示 Random1 和 Random2 值(分组)
没有对数据进行分组,我能够得到最早的开始日期、最晚的结束日期和值的总和。代码如下(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(文件中的最后一个)的值:
在这种情况下,这是预期的输出(在忽略随机列之后):
所以,我已将脚本更改为:
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 循环的最佳输出是什么?
【问题讨论】:
-
为什么忘记添加pandas标签。
-
如果您以易于使用的格式(而不是图像)提供数据,那么有人会更容易帮助和处理您的数据...
-
@JonClements 我想你这次打败了我发表评论。
-
没有数据(作为文本)=pandas 社区通常没有帮助。
-
但是,您的起点应该是
df.groupby('ID').agg('Start Date': 'min', 'End Date': 'max', 'Value': 'sum'})...目前还不清楚您希望随机列发生什么...
标签: python pandas csv pandas-groupby