【问题标题】:Python pandas check if the last element of a list in a cell contains specific stringPython pandas 检查单元格中列表的最后一个元素是否包含特定字符串
【发布时间】:2017-02-11 09:16:39
【问题描述】:
my dataframe df:

index                        url
1           [{'url': 'http://bhandarkarscollegekdp.org/'}]
2             [{'url': 'http://cateringinyourhome.com/'}]
3                                                     NaN
4                  [{'url': 'http://muddyjunction.com/'}]
5                       [{'url': 'http://ecskouhou.jp/'}]
6                     [{'url': 'http://andersrice.com/'}]
7       [{'url': 'http://durager.cz/'}, {'url': 'http:andersrice.com'}]
8            [{'url': 'http://milenijum-osiguranje.rs/'}]
9       [{'url': 'http://form-kind.org/'}, {'url': 'https://osiguranje'},{'url': 'http://beseka.com.tr'}]

如果url列的行列表中的最后一项包含'https',我想选择行,同时跳过缺失值。

我当前的脚本

df[df['url'].str[-1].str.contains('https',na=False)]

为所有行返回 False 值,而其中一些实际上包含 https。

有人可以帮忙吗?

【问题讨论】:

  • print (type(df.ix[1,'url'])) 是什么?
  • @jezrael 它是列表
  • 因为你的 dtype 是你必须使用的列表 apply: df['url'].apply(lambda x: 'https' in x[-1])
  • @EdChum 我试过了。它死了也不起作用。 TypeError: 'float' 对象不可下标
  • 试试df['url'].dropna().apply(lambda x: 'https' in x[-1]['url'])

标签: python loops pandas contain


【解决方案1】:

我觉得你可以先把NaN换成empty url再用apply

df = pd.DataFrame({'url':[[{'url': 'http://bhandarkarscollegekdp.org/'}],
                          np.nan,
                         [{'url': 'http://cateringinyourhome.com/'}],  
                         [{'url': 'http://durager.cz/'}, {'url': 'https:andersrice.com'}]]},
                  index=[1,2,3,4])

print (df)
                                                 url
1     [{'url': 'http://bhandarkarscollegekdp.org/'}]
2                                                NaN
3        [{'url': 'http://cateringinyourhome.com/'}]
4  [{'url': 'http://durager.cz/'}, {'url': 'https...

df.loc[df.url.isnull(), 'url'] = [[{'url':''}]]
print (df)
                                                 url
1     [{'url': 'http://bhandarkarscollegekdp.org/'}]
2                                      [{'url': ''}]
3        [{'url': 'http://cateringinyourhome.com/'}]
4  [{'url': 'http://durager.cz/'}, {'url': 'https...

print (df.url.apply(lambda x: 'https' in x[-1]['url']))
1    False
2    False
3    False
4     True
Name: url, dtype: bool

第一个解决方案:

df.loc[df.url.notnull(), 'a'] = 
df.loc[df.url.notnull(), 'url'].apply(lambda x: 'https' in x[-1]['url'])

df.a.fillna(False, inplace=True)
print (df)
                                                 url      a
1     [{'url': 'http://bhandarkarscollegekdp.org/'}]  False
2                                                NaN  False
3        [{'url': 'http://cateringinyourhome.com/'}]  False
4  [{'url': 'http://durager.cz/'}, {'url': 'https...   True

【讨论】:

  • 不错的解决方案!!
【解决方案2】:

不确定 url 是 str 还是其他类型

你可以这样做:

"https" in str(df.url[len(df)-1])

str(df.ix[len(df)-1].url).__contains__("https")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2019-06-21
    • 2017-11-20
    • 2010-10-04
    • 1970-01-01
    • 2022-11-14
    • 2017-09-28
    • 2018-04-21
    相关资源
    最近更新 更多