熊猫:如何打印包含列表中指定元素的行

时间:2019-02-17 15:30:42

标签: python pandas list

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

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)]
  .....................      

3 个答案:

答案 0 :(得分:1)

IIUC

  ages = [
  { ageID: 100, name: "0 -10 years", isChecked: false },
  { ageID: 200, name: "10 -20 years", isChecked: false },
  { ageID: 300, name: "30 -40 years", isChecked: false },
  { ageID: 400, name: "40 -50 years", isChecked: false }];

  languages = [
    { langID: 1, name: "English", isChecked: false },
    { langID: 2, name: "Tamil", isChecked: false },
    { langID: 3, name: "Hindi", isChecked: false },
    { langID: 4, name: "French", isChecked: false }];

数据输入

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)]

答案 1 :(得分: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 :(得分:0)

这应该做:

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)]