情况
我正在处理具有超过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数据框中的列从列表转换为字符串的方法。
用列表作为列过滤熊猫数据框的更好方法是什么?
答案 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']]]