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

(转)Python与Excel交互——Xlwings

使用xlwings在excel中的函数调用之间保留python全局变量

插上翅膀,让Excel飞起来——xlwings

xlwingsapi要如何导入

从空格分隔的 .dat 文件中获取日期时间 - python/pandas [重复]