Xlwings python pandas dataframe groupby返回重复数据
Posted
技术标签:
【中文标题】Xlwings python pandas dataframe groupby返回重复数据【英文标题】:Xlwings python pandas dataframe groupby returning duplicate data 【发布时间】:2020-03-30 17:59:56 【问题描述】:我想对第 0 列和第 1 列进行分组。我为“x”使用了一个命名范围,我们将其称为 x。它正在查看的数据如下:
1207 1500
1222 1500
1211 1500
1218 1500
1208 1500
1204 1500
1216 1500
1215 1500
1212 1500
1205 1500
1213 1500
1221 1500
1209 1500
1214 1500
1202 1500
1203 1500
1206 1500
1210 1500
1217 1500
1220 -10950
1219 -12675
1217 500
如果我在其他地方选择确切的大小范围并使用 ctrl+shift+enter,则下面的代码可以正常工作。它返回完全相同的数据。
@xw.arg('x', xw.Range)
@xw.ret(pd.DataFrame, index=False, header=False)
def udf_groupby_range_x(x):
res = x.options(pd.DataFrame, index=False, header=False).value
return res
但是,当我使用以下代码时,所有数据单元格都变为 1500。
@xw.arg('x', xw.Range)
@xw.ret(pd.DataFrame, index=False, header=False)
def udf_groupby_range_x(x):
res = x.options(pd.DataFrame, index=False, header=False).value
res = res.groupby(res.columns[0])[res.columns[1]].sum()
return res
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
1500 1500
我如何让它返回这个?
1207 1500
1222 1500
1211 1500
1218 1500
1208 1500
1204 1500
1216 1500
1215 1500
1212 1500
1205 1500
1213 1500
1221 1500
1209 1500
1214 1500
1202 1500
1203 1500
1206 1500
1210 1500
1217 2000 (was 1500)
1220 -10950
1219 -12675
1217 500 (gone)
【问题讨论】:
与你的问题无关,我只是好奇:你用 xlwings 做什么? 我是一名固定收益债券交易员,我使用 Excel 进行一些交易分析。我正在远离 VBA,因为我刚刚了解了 Python。我是个新手,但 Python 让我可以更轻松地在 Python 中操作数据。这个问题与需要在 Excel 中连接两个命名范围、按 cusip 分组、对数量求和然后删除重复的 cusips 的需要有关。 【参考方案1】:事实证明,我只需要 .reset_index()。我添加了一些更多的代码,我已经有了,但为了尽量减少混乱,它现在可以工作了。这将采用一个包含数据的命名范围,以及数据下方的空单元格,对第 1 列求和,然后按第 0 列分组并删除重复项。
@xw.func
@xw.arg('x', xw.Range)
@xw.ret(pd.DataFrame, index=False, header=False, expand='table')
def udf_groupby_range_x(x):
res = x.options(pd.DataFrame, index=False, header=False).value
res = res.groupby(res.columns[0])[res.columns[1]].sum().reset_index()
res = res.dropna(axis=0, how='all')
res.fillna("", inplace=True)
return res
【讨论】:
以上是关于Xlwings python pandas dataframe groupby返回重复数据的主要内容,如果未能解决你的问题,请参考以下文章
2019-12-13 (一)使用Xlwings从Excel,取数至Pandas的DataFrame和Series