在Pandas数据框列中的列表内搜索,错误

时间:2019-11-06 16:50:38

标签: python pandas dataframe

情况 我正在处理具有超过1000个表的数据库时遇到此问题。我想根据列名值过滤表名。我正在尝试在数据框上运行str.contains(),但出现错误。错误读取"None of [Float64Index([nan, nan, nan, nan, nan], dtype='float64')] are in the [columns]",我能够使用伪数据重现该错误。

我的目标是将过滤后的数据框返回到“ table5”,因为其中包含列名“ date”

listoftables = ['table1', 'table2', 'table3', 'table4', 'table5']
columnnames = [['age', 'name', 'school'], 
               ['age', 'name', 'school'], 
               ['age', 'name', 'school'], 
               ['age', 'name', 'school'], 
               ['audit', 'auditrunlist', 'date']]


example = pd.DataFrame(
    {'TableName': listoftables,
     'col_names'  : columnnames
    })

example[(example['col_names'].str.contains('date'))]

认为错误是因为我正在搜索列表中的字符串。更令我困惑的是,如果我运行example[(example['col_names'].str.contains('[audit, auditrunlist, date]'))],我会得到相同的错误。

如果我再添加一个不是列表的列,则会得到预期的结果


listoftables = ['table1', 'table2', 'table3', 'table4', 'table5']
columnnames = [['age', 'name', 'school'], 
               ['age', 'name', 'school'], 
               ['age', 'name', 'school'], 
               ['age', 'name', 'school'], 
               ['audit', 'auditrunlist', 'date']]

no_list_columnnames = ['age, name, school', 
               'age name school', 
                'age name school', 
               'age name school', 
               'audit auditrunlist date']


example = pd.DataFrame(
    {'TableName': listoftables,
     'col_names'  : columnnames,
     'no_list_col_names' : no_list_columnnames
    })

# this returns what i expect
example[(example['no_list_col_names'].str.contains('date'))]

我认为我有两个结果,我可以尝试找到一种在pandas数据框中的列表内搜索的方法,也可以找到一种将pandas数据框中的列从列表转换为字符串的方法。

用列表作为列过滤熊猫数据框的更好方法是什么?

2 个答案:

答案 0 :(得分:1)

感谢您指出这个问题很有趣,

我的方法是使用经典的应用创建标记

df['flag']=df.apply(lambda x: 1 if 'date' in x['col_names'] else 0, axis=1)

在我过滤之后:

df_filtered=df.loc[df['flag']==1,:]

它们可能存在聪明的选择,但这确实起作用

答案 1 :(得分:1)

这可以通过多种方式实现。

-过滤器

members.stream().max(//comparator)

-展开列表,然后过滤。该代码看起来会更好,但可能需要更多空间。

example = example[[True if ('date' in i) else False for i in example['col_names']]]