首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用字典的值在列中保留字符串

使用字典的值在列中保留字符串
EN

Stack Overflow用户
提问于 2021-12-02 13:48:47
回答 3查看 49关注 0票数 1

我希望根据字典的键和值保留具有最大值的字符串。对如何有效地做到这一点,有什么建议吗?

代码语言:javascript
运行
复制
fruit_dict = {
  "Apple": 10,
  "Watermelon": 20,
  "Cherry": 30
}

df = pd.DataFrame(
    {
        "ID": [1, 2, 3, 4, 5],
        "name": [
            "Apple, Watermelon",
            "Cherry, Watermelon",
            "Apple",
            "Cherry, Apple",
            "Cherry",
        ],
    }
)

   ID                name
0   1   Apple, Watermelon
1   2  Cherry, Watermelon
2   3               Apple
3   4       Cherry, Apple
4   5              Cherry

预期产出:

代码语言:javascript
运行
复制
   ID        name
0   1  Watermelon
1   2      Cherry
2   3       Apple
3   4      Cherry
4   5      Cherry
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-02 13:55:47

使用applymaxfruit_dict.get作为密钥的一种方法是:

代码语言:javascript
运行
复制
new_df = (df.assign(name=df['name'].str.split(', ')
            .apply(lambda l: max(l, key=fruit_dict.get)))
          )

或者,如果您期望字典中缺少一些名称:

代码语言:javascript
运行
复制
new_df = (df.assign(name=df['name'].str.split(', ')
            .apply(lambda l: max(l, key=lambda x: fruit_dict.get(x, float('-inf'))))
          )

产出:

代码语言:javascript
运行
复制
   ID        name
0   1  Watermelon
1   2      Cherry
2   3       Apple
3   4      Cherry
4   5      Cherry
票数 2
EN

Stack Overflow用户

发布于 2021-12-02 13:53:18

使用:

代码语言:javascript
运行
复制
df = (df.assign(name= df['name'].str.split(', '))
        .explode('name')
       .assign(new = lambda x: x['name'].map(fruit_dict))
        .sort_values(['ID', 'new'], ascending=[True, False])
        .drop_duplicates('ID')
       )
print (df)
   ID        name  new
0   1  Watermelon   20
1   2      Cherry   30
2   3       Apple   10
3   4      Cherry   30
4   5      Cherry   30

或者:

代码语言:javascript
运行
复制
df['new'] = df['name'].apply(lambda x: max(x.split(', '), key=fruit_dict.get))
print (df)
   ID                name         new
0   1   Apple, Watermelon  Watermelon
1   2  Cherry, Watermelon      Cherry
2   3               Apple       Apple
3   4       Cherry, Apple      Cherry
4   5              Cherry      Cherry

编辑:如果未返回匹配值,则为第一个值:

代码语言:javascript
运行
复制
fruit_dict = {
  "Apple": 10,
  "Watermelon": 20,
  "Cherry": 30
}

df = pd.DataFrame(
    {
        "ID": [1, 2, 3, 4, 5],
        "name": [
            "Apple, Watermelon",
            "Cherry, Watermelon",
            "Apple",
            "Cherry, Apple",
            "ooo, Cherry2, aaaa", <- changed data
        ],
    }
)
print (df)

代码语言:javascript
运行
复制
df1 = (df.assign(name= df['name'].str.split(', '))
        .explode('name')
       .assign(new = lambda x: x['name'].map(fruit_dict))
        .sort_values(['ID', 'new'], ascending=[True, False])
        .drop_duplicates('ID')
       )
print (df1)
   ID        name   new
0   1  Watermelon  20.0
1   2      Cherry  30.0
2   3       Apple  10.0
3   4      Cherry  30.0
4   5         ooo   NaN

如果需要NaN,如果没有匹配:

代码语言:javascript
运行
复制
df1['name'] = df1['name'].mask(df1.pop('new').isna())
print (df1)
   ID        name
0   1  Watermelon
1   2      Cherry
2   3       Apple
3   4      Cherry
4   5         NaN

代码语言:javascript
运行
复制
df['new1'] = df['name'].apply(lambda x: max(x.split(', '), key=lambda x: fruit_dict.get(x, float('-inf'))))

df['new2'] = df['name'].apply(lambda x: max(x.split(', '), key=lambda x: fruit_dict.get(x, 0)))

df['new3'] = df['name'].apply(lambda x: max(x.split(', '), key=lambda x: fruit_dict.get(x, 1000)))

print (df)
   ID                name        new1        new2        new3
0   1   Apple, Watermelon  Watermelon  Watermelon  Watermelon
1   2  Cherry, Watermelon      Cherry      Cherry      Cherry
2   3               Apple       Apple       Apple       Apple
3   4       Cherry, Apple      Cherry      Cherry      Cherry
4   5  ooo, Cherry2, aaaa         ooo         ooo         ooo
票数 1
EN

Stack Overflow用户

发布于 2022-11-24 02:13:28

代码语言:javascript
运行
复制
fruit_dict = {
    "Apple": 10,
    "Watermelon": 20,
    "Cherry": 30
}

df.assign(name=df.name.str.split(',')).name.map(lambda x:pd.Series(fruit_dict)[x].nlargest().index.values[0])

0    Watermelon
1        Cherry
2         Apple
3        Cherry
4        Cherry
Name: name, dtype: object
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70200649

复制
相关文章

相似问题

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