关于python:如何将pandas数据帧列或索引作为数组获取?

How do I get a pandas DataFrame column or index as an array?

您知道如何将数据帧的索引或列作为numpy数组或python列表获取吗?


要获得numpy数组,应使用values属性:

1
2
3
4
5
6
7
8
In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

这将访问数据的存储方式,因此不需要进行转换。注意:此属性也适用于许多其他熊猫的对象。

1
2
In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

要获取索引列表,请调用tolist

1
2
In [4]: df.index.tolist()
Out[4]: ['a', 'b']

同样,对于柱。


可以使用df.index访问索引对象,然后使用df.index.tolist()在列表中获取值。类似地,您可以使用df['col'].tolist()进行系列。


如果您处理的是多索引数据帧,那么您可能只对提取多索引的一个名称的列感兴趣。你可以这样做

1
df.index.get_level_values('name_sub_index')

当然,name_sub_index必须是FrozenListdf.index.names的元素。


电流从v0.24.0+,2019年开始。

反对你使用.values而赞成这些方法!

从v0.24.0开始,我们将有两种全新的、首选的方法从IndexSeriesdataframe对象获得numpy数组:它们是to_numpy().array。关于用法,文档提到:

We haven’t removed or deprecated Series.values or
DataFrame.values, but we highly recommend and using .array or
.to_numpy() instead.

有关更多信息,请参阅v0.24.0发行说明的本节。

to_numpy()

1
2
3
4
5
df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

默认情况下,返回视图。任何修改都将影响原始文件。

1
2
3
4
5
6
7
v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

如果您需要副本,请使用to_numpy(copy=True

1
2
3
4
5
6
7
v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

请注意,此函数也适用于数据帧(而.array不适用)。

array属性此属性返回支持索引/序列的ExtensionArray对象。

1
2
3
4
5
6
7
8
9
10
pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5
1
2
3
4
5
6
7
8
9
df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

从这里可以得到一个使用list的列表:

1
2
3
4
5
list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

或者直接打电话给.tolist()

1
2
3
4
5
df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

关于返回的内容,文件提到,

For Series and Indexes backed by normal NumPy arrays, Series.array
will return a new arrays.PandasArray, which is a thin (no-copy)
wrapper around a numpy.ndarray. arrays.PandasArray isn’t especially
useful on its own, but it does provide the same interface as any
extension array defined in pandas or by a third-party library.

综上所述,.array将返回

  • 支持索引/序列的现有ExtensionArray,或
  • 如果有numpy数组支持该系列,则会在底层数组上创建一个新的ExtensionArray对象作为一个薄包装。
  • 添加两种新方法的理由这些职能是根据两个Github问题GH19954和GH23623进行讨论后增加的。

    具体来说,文件提到了理由:

    [...] with .values it was unclear whether the returned value would be the
    actual array, some transformation of it, or one of pandas custom
    arrays (like Categorical). For example, with PeriodIndex, .values
    generates a new ndarray of period objects each time. [...]

    这两个函数旨在提高API的一致性,这是朝着正确方向迈出的重要一步。

    最后,在当前版本中,.values不会被弃用,但我预计这在将来的某个时候可能会发生,因此我会敦促用户尽快迁移到新的API。


    由于pandas v0.13,您也可以使用get_values

    1
    df.index.get_values()


    我把大熊猫dataframe改成list,然后用基本的list.index()。像这样:

    1
    2
    dd = list(zone[0]) #Where zone[0] is some specific column of the table
    idx = dd.index(filename[i])

    您的索引值为idx