我有一个以下格式的文本文件。
[1,2]
[3]
[4,5,6,7,10]
我有一只大熊猫DataFrame
如下。
df = pd.DataFrame({'id' : [1,2,3,4,5,6,7],
'path' : ["p1,p2,p3,p4","p1,p2,p1","p1,p5,p5,p7","p1,p2,p3,p3","p1,p2","p1","p2,p3,p4"]})
输出:
id path
0 1 p1,p2,p3,p4
1 2 p1,p2,p1
2 3 p1,p5,p5,p7
3 4 p1,p2,p3,p3
4 5 p1,p2
5 6 p1
6 7 p2,p3,p4
我想根据文本文件对DataFrame
进行切片。以下是什么问题?它会生成空的DataFrame。
for line in lines:
print line
print df[df['id'].isin(line)]
但它可以正常使用。
for line in lines:
print df[df['id'].isin([1,2])]
答案 0 :(得分:3)
line
是一个字符串。 [1,2]
是一个列表。要将字符串转换为列表,您可以使用ast.literal_eval:
import ast
line = ast.literal_eval(line)
import ast
for line in lines:
print line
line = ast.literal_eval(line)
print df.loc[df['id'].isin(line)]
PS。虽然df[boolean_mask]
有效,但我认为df.loc[boolean_mask]
更好,因为它不需要读者了解boolean_mask
中值的类型,以了解df
的哪种方式属于选中(按行或按列)。 df.loc
更明确,更快一点。