【问题标题】:Slice pandas DataFrame based on csv of lists根据列表的 csv 对 pandas DataFrame 进行切片
【发布时间】:2014-04-07 10:10:31
【问题描述】:

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

[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 进行切片。跟风有什么问题?它产生空的数据帧。

for line in lines:
    print line
    print df[df['id'].isin(line)]

但它适用于跟随。

for line in lines:
    print df[df['id'].isin([1,2])]

【问题讨论】:

    标签: python csv pandas dataframe


    【解决方案1】:

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

    【讨论】:

    • 太棒了..在这上面浪费了很多时间。谢谢:)
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    相关资源
    最近更新 更多