首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于另一个数据数据对熊猫值进行排序

基于另一个数据数据对熊猫值进行排序
EN

Stack Overflow用户
提问于 2020-12-08 10:18:43
回答 3查看 61关注 0票数 2

我有一个这样的df_1

代码语言:javascript
复制
A                      

apple, iphone, android
facebook, apple
macbook, laptop
firestick, hulu, netflix
android, laptop
laptop

df_2是这样的:

代码语言:javascript
复制
A           B

apple       1
macbook     2
facebook    3
firestick   4
hulu        5
netflix     6
android     7
laptop      8

我试图从Adf_1中提取一个单词,它在列B中的值最低,如下所示:

代码语言:javascript
复制
A                               B_new

apple, iphone, android          apple
facebook, apple                 apple
macbook, laptop                 macbook
hulu, netflix, firestick        firesick
laptop, android                 android                 
laptop                          laptop

我假设我可以根据df_1A中的B值对df_2的每个值进行排序。或者创建一个函数,该函数从df_1接收单个df_1值,并以B中最小的数字从df_2返回str。但是,由于数据相当大,我认为使用apply不是很有效。有一种灵巧的熊猫来完成这样的任务吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-08 10:42:12

如果存在,您可以创建字典和匹配值,然后获得最大值,否则丢失值:

代码语言:javascript
复制
d = df_2.set_index('A')['B'].to_dict()

def f(x):
    d1 = {y:d[y] for y in x.split(', ') if y in d}
    return min(d1, key=d1.get)  if len(d1) > 1 else np.nan

或者:

代码语言:javascript
复制
import operator

def f(x):
    d1 = {y:d[y] for y in x.split(', ') if y in d}
    return min(d1.items(), key=operator.itemgetter(1))[0] if len(d1) > 1 else np.nan

代码语言:javascript
复制
df_1['new'] = df_1['A'].apply(f)
print (df_1)
                          A        new
0    apple, iphone, android      apple
1           facebook, apple      apple
2           macbook, laptop    macbook
3  firestick, hulu, netflix  firestick
4           android, laptop    android
5                    laptop     laptop
票数 2
EN

Stack Overflow用户

发布于 2020-12-08 10:56:17

@jezrael的解决方案更干净,而且应该更快,因为我们正在处理字符串;下面的解决方案是另一种选择:

迭代以获得各个条目:

代码语言:javascript
复制
values = [[value.strip() for value in entry.split(",")] 
          for entry in df1.A.__iter__()]
values

[['apple', 'iphone', 'android'],
 ['facebook', 'apple'],
 ['macbook', 'laptop'],
 ['firestick', 'hulu', 'netflix'],
 ['android', 'laptop'],
 ['laptop']]

获取最小值,在本例中这将是第一个True:

代码语言:javascript
复制
values = [df2.loc[df2.A.isin(value), "B"].idxmin() 
          for value in values]
values
[0, 0, 1, 3, 6, 7]

选择值并将其赋值给新列:

代码语言:javascript
复制
df1.loc[:, 'B_new'] = df2.iloc[values, 0]


       A                           B_new
0   apple, iphone, android         apple
1   facebook, apple                apple
2   macbook, laptop               macbook
3   firestick, hulu, netflix    firestick
4   android, laptop              android
5   laptop                        laptop
票数 1
EN

Stack Overflow用户

发布于 2020-12-08 11:18:23

也不是最快的,但我喜欢用另一种方式思考这个问题。

您可以使用str.get_dummies方法,执行逐行乘法,并接受idxmin:

代码语言:javascript
复制
ab_dict = df_2.set_index("A")["B"].to_dict()
df_1["B"] = df_1["A"].str.get_dummies(", ")
        .apply(lambda c: c.replace(0, np.nan)*ab_dict.get(c.name, np.nan))
        .idxmin(axis=1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65197027

复制
相关文章

相似问题

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