【问题标题】:Pandas: How to print rows containing specified element of listPandas:如何打印包含列表指定元素的行
【发布时间】:2019-02-17 15:30:41
【问题描述】:

我有一个看起来像这样的数据框(示例):

column1     column2            column3
  xyz         123         [(ab,cv), (da,ndfds)]
  dsja        32421            [(ab,cv)]
  dgsag       3252        [(dsfsa,sfa), (sd,sfag)]
 ....................

首先,我想获得所有列表中出现频率最高的对。 例如:

 (ab,cv)    2
 (da,ndfds) 1
 ..........

例如,我希望能够调用在 column3 中包含条目 (ab,cv) 的所有行。

预期的输出是:

 column1     column2            column3
  xyz         123         [(ab,cv), (da,ndfds)]
  dsja        32421            [(ab,cv)]
  .....................      

【问题讨论】:

  • 到目前为止你有没有试过的代码?

标签: python pandas list


【解决方案1】:

首先是一般性评论:Pandas 很棒,但是当您开始在列中的列表中包含元组时,它可能不再是正确的工具了。 Pandas 专为表格数据而设计,您处理的内容显然更具结构化。

话虽如此,这是我的解决方案。

首先,让我们创建DataFrame(以便该示例可重现):

import pandas as pd

df = pd.DataFrame({
    'col_1': ['xyz', 'dsja', 'dgsag'],
    'col_2': [123, 32421, 3252],
    'col_3': [
        [('ab','cv'),('da','ndfds')], 
        [('ab','cv')], 
        [('dsfsa','sfa'),('sd','sfag')]]
})

给了

>>> df
    col_1   col_2   col_3
0   xyz     123     [(ab, cv), (da, ndfds)]
1   dsja    32421   [(ab, cv)]
2   dgsag   3252    [(dsfsa, sfa), (sd, sfag)]

现在,通过collections.Counter 可以轻松计算出现次数,您需要先连接所有这些列表:

from collections import Counter

Counter(t for row in df['col_3'] for t in row)

Counter({('ab', 'cv'): 2,
         ('da', 'ndfds'): 1,
         ('dsfsa', 'sfa'): 1,
         ('sd', 'sfag'): 1})

您获得的Counter 对象有一个most_common 方法,该方法接受您想要的项目数作为参数(例如最常见的3 个)。

现在,第二点只是逻辑索引。您可以通过loc 进行索引,并且(根据以下其他答案进行了改进)使用生成器进行比较:

t = ('ab', 'cv')

df.loc[(t in l for l in df['col_3']), :]

    col_1   col_2   col_3
0   xyz     123     [(ab, cv), (da, ndfds)]
1   dsja    32421   [(ab, cv)]

【讨论】:

    【解决方案2】:

    IIUC

    df[[any(y in l for y in x) for x in df.col3]]
    Out[57]: 
      col1                     col3
    0    x  [(ab, cv), (da, ndfds)]
    1    y               [(ab, cv)]
    

    数据输入

    df=pd.DataFrame({'col1':['x','y','z'],'col3':[[('ab','cv'), ('da','ndfds')],[('ab','cv')],[('dsfsa','sfa'), ('sd','sfag')]]})
    l=[('ab','cv'),('da','ndfds')]
    

    【讨论】:

      【解决方案3】:

      应该这样做:

      df[('ab','cv') in l for l in df.column3]
          column1 column2 column3
      0   xyz 123 [(ab,cv),(da,ndfds)]
      1   dsja    32421   [(ab,cv)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        • 2020-11-15
        • 1970-01-01
        相关资源
        最近更新 更多