首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将DataFrame索引和列与字典键和多个值匹配?

如何将DataFrame索引和列与字典键和多个值匹配?
EN

Stack Overflow用户
提问于 2022-02-16 22:20:49
回答 1查看 198关注 0票数 1

我如何修改下面的字典理解,以考虑到列s也应该是一个匹配的标准?

代码语言:javascript
复制
import pandas as pd 

dct = {'NNI' : pd.DataFrame({'s': [-1, -1, -1, 1, 1],
                             'count': [13, 11, 10,12, 16]},
                            index =['2007-07-13', '2019-09-18', '2016-08-01', '2021-04-05','2017-01-04' ]),
       'NVEC' : pd.DataFrame({'s': [-1, -1, -1, 1, 1],
                              'count': [12, 10, 9,14,5]},
                             index =['2012-10-09', '2018-10-01', '2022-02-01', '2020-03-20','2016-04-06'])
      }

df = pd.DataFrame({'Date': ['2022-02-14', '2022-02-14', '2022-02-14', '2022-02-14', '2022-02-14'], 
                   's': [-1,-1,-1,1,1], 
                   'count': [10, 10, 10, 9, 9]}, 
                  index = ['NNI', 'NVEC', 'IPA', 'LYTS', 'MYN'])

df

代码语言:javascript
复制
            Date  s  count
NNI   2022-02-14 -1     10
NVEC  2022-02-14 -1     10
IPA   2022-02-14 -1     10
LYTS  2022-02-14  1      9
MYN   2022-02-14  1      9

dct

代码语言:javascript
复制
{'NNI':       s  count
 2007-07-13  -1     13
 2019-09-18  -1     11
 2016-08-01  -1     10
 2021-04-05   1     12
 2017-01-04   1     16,

 'NVEC':      s  count
 2012-10-09  -1     12
 2018-10-01  -1     10
 2022-02-01  -1      9
 2020-03-20   1     14
 2016-04-06   1      5}

到目前为止,这就是我所拥有的:

代码语言:javascript
复制
df = df.assign(ratio=pd.Series({k: v['count'].gt(df.loc[k, 'count']).sum() / 
v['count'].ge(df.loc[k, 'count']).sum() for k,v in dct.items()})).fillna(0)

df
            Date  s  count     ratio
NNI   2022-02-14 -1     10  0.800000
NVEC  2022-02-14 -1     10  0.666667
IPA   2022-02-14 -1     10  0.000000
LYTS  2022-02-14  1      9  0.000000
MYN   2022-02-14  1      9  0.000000

期望的结果是:

代码语言:javascript
复制
df
            Date  s  count     ratio
NNI   2022-02-14 -1     10  0.666667
NVEC  2022-02-14 -1     10  0.500000
IPA   2022-02-14 -1     10  0.000000
LYTS  2022-02-14  1      9  0.000000
MYN   2022-02-14  1      9  0.000000
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-16 22:25:16

可以将其添加为布尔掩码,如下所示:

代码语言:javascript
复制
v.loc[v['s'] == df.loc[k, 's'], 'count']

因此,代码变成:

代码语言:javascript
复制
df = df.assign(ratio=pd.Series({k: v.loc[v['s'] == df.loc[k, 's'], 'count'].gt(df.loc[k, 'count']).sum() / 
                                v.loc[v['s'] == df.loc[k, 's'], 'count'].ge(df.loc[k, 'count']).sum() 
                                for k,v in dct.items()})).fillna(0)

输出:

代码语言:javascript
复制
            Date  s  count     ratio
NNI   2022-02-14 -1     10  0.666667
NVEC  2022-02-14 -1     10  0.500000
IPA   2022-02-14 -1     10  0.000000
LYTS  2022-02-14  1      9  0.000000
MYN   2022-02-14  1      9  0.000000

这只是一个建议,但在这里使用助手函数可能会很有帮助,因为这里的划分是不可读的,特别是在添加索引之后。你可以用:

代码语言:javascript
复制
def get_ratio(df_row, v):
    msk = v['s'] == df_row['s']
    numerator = v.loc[msk, 'count'].gt(df_row['count']).sum()
    denominator = v.loc[msk, 'count'].ge(df_row['count']).sum()
    return numerator / denominator

df = df.assign(ratio = pd.Series({k: get_ratio(df.loc[k], v) for k,v in dct.items()})).fillna(0)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71150002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档