基于列表的csv切片pandas DataFrame

时间:2014-04-07 10:10:32

标签: python csv pandas dataframe

我有一个以下格式的文本文件。

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

1 个答案:

答案 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更明确,更快一点。