【问题标题】:List comprehension Pandas列表理解 Pandas
【发布时间】:2017-12-03 06:32:15
【问题描述】:

如果它们存在于数据框中,我会尝试标记一行。这是我的代码的 sn-p:

MissingAATracking = []
    for row in UK.UK:
        if row in links_adobe_uk:
            MissingAATracking.append("NO")
        else:
            MissingAATracking.append("YES")

我收到以下错误:

> --------------------------------------------------------------------------- TypeError                                 Traceback (most recent call
> last) <ipython-input-94-5b85f0a628ec> in <module>()
>       1 for row in UK.UK:
> ----> 2     if row in links_adobe_uk:
>       3         MissingAATracking.append("NO")
>       4     else:
>       5         MissingAATracking.append("YES")
> 
> /anaconda/lib/python3.6/site-packages/pandas/core/generic.py in
> __contains__(self, key)
>     905     def __contains__(self, key):
>     906         """True if the key is in the info axis"""
> --> 907         return key in self._info_axis
>     908 
>     909     @property
> 
> /anaconda/lib/python3.6/site-packages/pandas/core/indexes/base.py in
> __contains__(self, key)    1588     @Appender(_index_shared_docs['__contains__'] % _index_doc_kwargs)   
> 1589     def __contains__(self, key):
> -> 1590         hash(key)    1591         try:    1592             return key in self._engine
> 
> TypeError: unhashable type: 'list'

我看过这里:Python, TypeError: unhashable type: 'list'

更新

这是我的英国数据框的头部的样子:

         UK
0       Link1
1       Link1
2       Link1
3       Link1
4       Link1

还有我的 links_adobe_uk:

        PageURL
0       (null)
1       Link1
2       Link1
3       Link1
4       Link1

我也尝试从两列中删除重复项,但我的英国数据框抛出了

TypeError: unhashable type: 'list'

但我似乎无法理解,因为 UK 和 links_adobe_uk 都是数据框。我会很感激这方面的指导

【问题讨论】:

  • 您正在尝试从links_adobe_uk 中的UK 数据帧中搜索一行,这是不可能的。您应该做的是为每行提供一些唯一键,或者使用索引来检查行是否存在于其他数据框中。
  • 如果您显示几行 UK 和 links_adobe_uk 数据框,您将立即获得一种更有效的方式来做您想做的事情。
  • 如果可能的话,也分享你的两个数据框的几行样本。我们将能够提供更好的帮助。
  • 谢谢大家了
  • 我刚刚尝试在 UK 数据框上删除重复但再次收到 TypeError: unhashable type: 'list' 错误

标签: python python-3.x pandas dataframe list-comprehension


【解决方案1】:

由于数据框“links_adobe_uk”仅包含一列,因此将其视为一个系列。这就是它显示错误“Unhashable type:list”的原因。因此将系列转换为列表将解决问题

list_to_search = links_adobe_UK.PageURL.values.tolist()
MissingAATracking = []
for row in UK.UK:
    if row in list_to_search:
        MissingAATracking.append('No')
    else:
        MissingAATracking.append('Yes')
print(MissingAATracking)

【讨论】:

    【解决方案2】:
    import pandas as pd
    
    df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5]}) 
    df2 = pd.DataFrame(data = {'col1' : [1, 2, 3]})
    
    # merge both dataframes on the common column
    common = df1.merge(df2,on=['col1'])
    
    # wherever the common column is present in df1 return "YES" else "NO"
    missing_tracking = ["Yes" if val else "No" for val in (df1.col1.isin(common.col1)).values ]
    

    输出:

    ['Yes', 'Yes', 'Yes', 'No', 'No']
    

    致谢:pandas get rows which are NOT in other dataframe

    【讨论】:

      【解决方案3】:

      这个程序的目标可以分为两部分:

      1. 迭代 data.frame 中的行
      2. 检查每一行是否在另一个data.frame中

      我相信for row in UK.UK: 的处理并不是那么简单。

      请检查以上两个部分的这两个答案。
      How to iterate over rows in a DataFrame in Pandas?
      Pandas: Check if row exists with certain values

      【讨论】:

        猜你喜欢
        • 2019-12-26
        • 2020-09-18
        • 2020-11-08
        • 1970-01-01
        • 2020-08-18
        • 2020-12-08
        • 1970-01-01
        • 2019-03-10
        • 1970-01-01
        相关资源
        最近更新 更多