【问题标题】:How can I select a specific column from each row in a Pandas DataFrame?如何从 Pandas DataFrame 的每一行中选择特定列?
【发布时间】:2014-07-18 20:17:46
【问题描述】:

我有一个这种格式的 DataFrame:

    a   b   c
0   1   2   3
1   4   5   6
2   7   8   9
3   10  11  12
4   13  14  15

还有一个像这样的数组,带有列名:

['a', 'a', 'b', 'c', 'b']

我希望提取一组数据,每行一个值。列名数组指定每行中我想要的列。在这里,结果将是:

[1, 4, 8, 12, 14]

这可以作为 Pandas 的单个命令,还是我需要迭代?我尝试使用索引

i = pd.Index(['a', 'a', 'b', 'c', 'b'])
i.choose(df)

但我遇到了段错误,由于缺少文档,我无法诊断。

【问题讨论】:

    标签: python numpy pandas


    【解决方案1】:

    你可以使用lookup,例如

    >>> i = pd.Series(['a', 'a', 'b', 'c', 'b'])
    >>> df.lookup(i.index, i.values)
    array([ 1,  4,  8, 12, 14])
    

    如果您愿意,i.index 可能与 range(len(i)) 不同。

    【讨论】:

    • 太棒了,谢谢!是否也可以将这些索引分配
    • 可以分配,但仅当框架是单个 dtype 时(就像现在一样)。 df.unstack().loc[zip(i.values,i.index)] = [1,2,3,4,5]。并且必须匹配两边的长度(也可以使用这种语法进行选择);看到这个问题:github.com/pydata/pandas/issues/7138
    • 如果要添加索引,做一个系列:pd.Series(df.lookup(i.index, i.values), index=i.index)
    • 在 pandas 1.2.0 中,不推荐使用查找功能,建议使用 .loc 或 .melt(请参阅:pandas.pydata.org/pandas-docs/stable/reference/api/…
    【解决方案2】:

    对于大型数据集,如果您准备将列名转换为数字索引(在这种情况下很简单),则可以对基本 numpy 数据使用索引:

    df.values[arange(5),[0,0,1,2,1]]
    
    out: array([ 1,  4,  8, 12, 14])
    

    这将比列表推导或其他显式迭代更有效。

    【讨论】:

    • 这应该是新接受的答案。由于pd.lookup() 现在已弃用,melt() 解决方案可能会让您陷入大型数据集的内存问题
    【解决方案3】:

    你总是可以使用列表推导:

    [df.loc[idx, col] for idx, col in enumerate(['a', 'a', 'b', 'c', 'b'])]
    

    【讨论】:

    • 这不是向量化的,你可以用 for 循环做任何事情
    猜你喜欢
    • 2018-06-08
    • 2018-09-04
    • 2020-01-08
    • 2019-01-12
    • 2020-05-26
    • 2021-12-04
    • 2023-03-21
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多