Pandas VLOOKUP 未匹配的值

huangapple go评论74阅读模式
英文:

Pandas VLOOKUP values that do not match

问题

以下是翻译的代码部分:

  1. 例如我有两个表格
  2. `w_results.xlsx`
  3. [![在这里输入图片描述][1]][1]
  4. 项目 类型 得分
  5. 0 mashed potatoes 食物 30
  6. 1 丹尼尔 人员 99
  7. 2 纸张 物品 24
  8. 3 约翰 人员 195
  9. 4 物品 5
  10. 5 杰西卡 人员 92
  11. 6 披萨 食物 42
  12. 7 食物 2
  13. 8 雅各布 人员 83
  14. `w_runnable.xlsx`
  15. [![在这里输入图片描述][2]][2]
  16. 项目 类型 得分
  17. 0 mashed potatoes 食物 30
  18. 1 约翰 人员 195
  19. 2 树莓 食物 50
  20. 3 苹果手机 物品 75
  21. 4 小船 物品 5
  22. 5 杰克 人员 25
  23. 6 披萨 食物 42
  24. 7 食物 2
  25. 8 丹尼尔 人员 99
  26. 如何获取在`w_results`项目列中出现但在`w_runnable`项目列中未出现的所有值的表格
  27. 我知道使用`pd.merge`可能是正确的方法但它只输出匹配项我尝试如下
  28. ```python
  29. import pandas as pd
  30. w_results = 'w_results.xlsx'
  31. w_runnable = 'w_runnable.xlsx'
  32. df_results_mylist = pd.read_excel(w_results, sheet_name='my_list')
  33. df_runnable_mylist = pd.read_excel(w_runnable, sheet_name='my_list')
  34. left_join = pd.merge(df_results_mylist,
  35. df_runnable_mylist,
  36. on='项目',
  37. how='left')
  38. print(left_join)

输出:

  1. 项目 类型_x 得分 类型_y 得分
  2. 0 mashed potatoes 食物 30 食物 30.0
  3. 1 丹尼尔 人员 99 人员 99.0
  4. 2 纸张 物品 24 NaN NaN
  5. 3 约翰 人员 195 人员 195.0
  6. 4 物品 5 NaN NaN
  7. 5 杰西卡 人员 92 NaN NaN
  8. 6 披萨 食物 42 食物 42.0
  9. 7 食物 2 食物 2.0
  10. 8 雅各布 人员 83 NaN NaN

不匹配的值显示为NaN(纸张,灯,杰西卡,雅各布)。
不知道是否有更简洁的方法来执行此操作,以便这些值出现在单独的表格中。感谢任何帮助。

期望的输出:

Pandas VLOOKUP 未匹配的值

  1. <details>
  2. <summary>英文:</summary>
  3. For example I have two tables:
  4. `w_results.xlsx`:
  5. [![enter image description here][1]][1]
  6. Item Type Score
  7. 0 mashpotatoes food 30
  8. 1 daniel person 99
  9. 2 paper thing 24
  10. 3 john person 195
  11. 4 lamp thing 5
  12. 5 jessica person 92
  13. 6 pizza food 42
  14. 7 meat food 2
  15. 8 jacob person 83
  16. `w_runnable.xlsx`:
  17. [![enter image description here][2]][2]
  18. Item Type Score
  19. 0 mashpotatoes food 30
  20. 1 john person 195
  21. 2 raspberry food 50
  22. 3 iphone thing 75
  23. 4 boat thing 5
  24. 5 jake person 25
  25. 6 pizza food 42
  26. 7 meat food 2
  27. 8 daniel person 99
  28. How can I get a table of all values that appear on w_results &#39;Item&#39; column but not in w_runnable &quot;Item&quot; column?
  29. I know that using `pd.merge` is probably the way to go, but it just outputs the matches. My attempt below:
  30. import pandas as pd
  31. w_results = &#39;w_results.xlsx&#39;
  32. w_runnable = &#39;w_runnable.xlsx&#39;
  33. df_results_mylist = pd.read_excel(w_results, sheet_name=&#39;my_list&#39;)
  34. df_runnable_mylist = pd.read_excel(w_runnable, sheet_name=&#39;my_list&#39;)
  35. left_join = pd.merge(df_results_mylist,
  36. df_runnable_mylist,
  37. on = &#39;Item&#39;,
  38. how = &#39;left&#39;)
  39. print(left_join)
  40. Output:
  41. Item Type_x Score Type_y Score
  42. 0 mashpotatoes food 30 food 30.0
  43. 1 daniel person 99 person 99.0
  44. 2 paper thing 24 NaN NaN
  45. 3 john person 195 person 195.0
  46. 4 lamp thing 5 NaN NaN
  47. 5 jessica person 92 NaN NaN
  48. 6 pizza food 42 food 42.0
  49. 7 meat food 2 food 2.0
  50. 8 jacob person 83 NaN NaN
  51. The values that do not match appear as `NaN` (paper, lamp, jessica, jacob).
  52. Don&#39;t know if there&#39;s a cleaner way to do this, so that these values appears in a separate table. Any help would be appreciated.
  53. Desired output:
  54. [![enter image description here][3]][3]
  55. [1]: https://i.stack.imgur.com/xialb.png
  56. [2]: https://i.stack.imgur.com/HETwK.png
  57. [3]: https://i.stack.imgur.com/ptMJA.png
  58. </details>
  59. # 答案1
  60. **得分**: 1
  61. **代码**
  62. 将“Item”列和“Type”列转换为Series中的列表
  63. ```python
  64. cols = ['Item', 'Type']
  65. df_results_mylist[cols].agg(list, axis=1)

结果:

  1. 0 [mashpotatoes, food]
  2. 1 [daniel, person]
  3. 2 [paper, thing]
  4. 3 [john, person]
  5. 4 [lamp, thing]
  6. 5 [jessica, person]
  7. 6 [pizza, food]
  8. 7 [meat, food]
  9. 8 [jacob, person]
  10. dtype: object

使用isin函数创建条件的类似方式

  1. cond = df_results_mylist[cols].agg(list, axis=1).isin(df_runnable_mylist[cols].agg(list, axis=1))

条件:

  1. 0 True
  2. 1 True
  3. 2 False
  4. 3 True
  5. 4 False
  6. 5 False
  7. 6 True
  8. 7 True
  9. 8 False
  10. dtype: bool

如果仅需要检查“Item”列的相等性,请使用以下代码创建条件,而不是上面的代码

  1. cond = df_results_mylist['Item'].isin(df_runnable_mylist['Item'].unique())

无论如何生成cond,让我们通过~cond进行布尔索引

  1. df_results_mylist[~cond]

输出:

  1. Item Type Score
  2. 2 paper thing 24
  3. 4 lamp thing 5
  4. 5 jessica person 92
  5. 8 jacob person 83
英文:

Code

make Item column and Type column to list in Series

  1. cols = [&#39;Item&#39;, &#39;Type&#39;]
  2. df_results_mylist[cols].agg(list, axis=1)

result:

  1. 0 [mashpotatoes, food]
  2. 1 [daniel, person]
  3. 2 [paper, thing]
  4. 3 [john, person]
  5. 4 [lamp, thing]
  6. 5 [jessica, person]
  7. 6 [pizza, food]
  8. 7 [meat, food]
  9. 8 [jacob, person]
  10. dtype: object

create condition using isin function in similar way

  1. cond = df_results_mylist[cols].agg(list, axis=1).isin(df_runnable_mylist[cols].agg(list, axis=1))

cond :

  1. 0 True
  2. 1 True
  3. 2 False
  4. 3 True
  5. 4 False
  6. 5 False
  7. 6 True
  8. 7 True
  9. 8 False
  10. dtype: bool

If it is necessary to check equality only in Item column, create condition with code below instead of code above.

  1. cond = df_results_mylist[&#39;Item&#39;].isin(df_runnable_mylist[&#39;Item&#39;].unique())

<br>


no matter how cond was made, lets do boolean indexing by ~cond

  1. df_results_mylist[~cond]

output:

  1. Item Type Score
  2. 2 paper thing 24
  3. 4 lamp thing 5
  4. 5 jessica person 92
  5. 8 jacob person 83

huangapple
  • 本文由 发表于 2023年7月6日 10:58:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/76625215.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定