python - 如何删除重复条目但保留第一行选定列值和最后一行选定列值?
问题描述
我正在 periscopedata 中创建图表并使用 pandas 来得出我们的结果。从结果中删除重复项时,我遇到了困难。
这是计算后我们的数据在最终数据框中的样子。
vendor_ID date opening purchase paid closing
B2345 01/01/2015 5 20 10 15
B2345 01/01/2015 15 50 20 45
B2345 02/01/2015 45 4 30 19
我想删除基于 vendor_ID 和日期的重复条目,但保持开始打开并保持最后一个条目关闭
即)我想要的预期结果
vendor_ID date opening purchase paid closing
B2345 01/01/2015 5 70 30 45
B2345 02/01/2015 45 4 30 19
我试过下面的代码来删除重复项,但这给了我们不同的错误。
df.drop_duplicates(subset=["vendor_ID", "date"], keep="last", inplace=True)
我如何编写这样的代码来删除重复项并保留上面示例中提到的第一个和最后一个。
解决方案
使用GroupBy.agg
with GroupBy.first
,GroupBy.last
并GroupBy.sum
为输出的每一列指定:
注意:感谢@Erfan - 如果需要使用最小和最大列而不是第一个和最后一个将dict更改为{'opening':'min','purchase':'sum','paid':'sum', 'closing':'max'}
df1 = (df.groupby(["vendor_ID", "date"], as_index=False)
.agg({'opening':'first','purchase':'sum','paid':'sum', 'closing':'last'}))
print (df1)
vendor_ID date opening purchase paid closing
0 B2345 01/01/2015 5 70 30 45
1 B2345 02/01/2015 45 4 30 19
此外,如果不确定日期时间是否已排序:
df['date'] = pd.to_datetime(df['date'], dayfirst=True)
df = df.sort_values(["vendor_ID", "date"])
df1 = (df.groupby(["vendor_ID", "date"], as_index=False)
.agg({'opening':'first','purchase':'sum','paid':'sum', 'closing':'last'}))
print (df1)
vendor_ID date opening purchase paid closing
0 B2345 2015-01-01 5 70 30 45
1 B2345 2015-01-02 45 4 30 19
您还可以为sum
没有前 2 的所有列创建字典动态,并用于第一个和最后一个:
df['date'] = pd.to_datetime(df['date'], dayfirst=True)
df = df.sort_values(["vendor_ID", "date"])
d = {'opening':'first', 'closing':'last'}
sum_cols = df.columns.difference(list(d.keys()) + ['vendor_ID','date'])
final_d = {**dict.fromkeys(sum_cols,'sum'), **d}
df1 = df.groupby(["vendor_ID", "date"], as_index=False).agg(final_d).reindex(df.columns,axis=1)
print (df1)
vendor_ID date opening purchase paid closing
0 B2345 2015-01-01 5 70 30 45
1 B2345 2015-01-02 45 4 30 19
推荐阅读
- batch-file - 有一些特定的图像文件,需要将选定的文件复制到另一个文件夹
- javascript - 如何在html表中的串行单元格中删除类
- java - 向 java.util.date 对象添加毫秒时的错误结果
- python - 收到此错误 RuntimeError: size mismatch, m1: [10 x 33], m2: [34 x 10]
- database - 如何更改 Open Client sybase 中的最大连接数
- android - 此类在 API 级别 R 中已弃用。 - 这是什么意思?
- java - 从 IntelliJ 的项目目录中删除 Maven 配置文件的其他模块
- opengl - phong 和 goraud 着色 - 需要有关片段如何着色的知识
- javascript - 提供查询参数时显示 404 的反应查询字符串
- html - 如何使用 CSS 在表格上应用边框间距