我有一个这样的df_1:
A
apple, iphone, android
facebook, apple
macbook, laptop
firestick, hulu, netflix
android, laptop
laptopdf_2是这样的:
A B
apple 1
macbook 2
facebook 3
firestick 4
hulu 5
netflix 6
android 7
laptop 8我试图从A列df_1中提取一个单词,它在列B中的值最低,如下所示:
A B_new
apple, iphone, android apple
facebook, apple apple
macbook, laptop macbook
hulu, netflix, firestick firesick
laptop, android android
laptop laptop我假设我可以根据df_1列A中的B值对df_2的每个值进行排序。或者创建一个函数,该函数从df_1接收单个df_1值,并以B中最小的数字从df_2返回str。但是,由于数据相当大,我认为使用apply不是很有效。有一种灵巧的熊猫来完成这样的任务吗?
发布于 2020-12-08 10:42:12
如果存在,您可以创建字典和匹配值,然后获得最大值,否则丢失值:
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或者:
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.nandf_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发布于 2020-12-08 10:56:17
@jezrael的解决方案更干净,而且应该更快,因为我们正在处理字符串;下面的解决方案是另一种选择:
迭代以获得各个条目:
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:
values = [df2.loc[df2.A.isin(value), "B"].idxmin()
for value in values]
values
[0, 0, 1, 3, 6, 7]选择值并将其赋值给新列:
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发布于 2020-12-08 11:18:23
也不是最快的,但我喜欢用另一种方式思考这个问题。
您可以使用str.get_dummies方法,执行逐行乘法,并接受idxmin:
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)https://stackoverflow.com/questions/65197027
复制相似问题