如何检索 Pandas 数据框中的列数?

Posted

技术标签:

【中文标题】如何检索 Pandas 数据框中的列数?【英文标题】:How do I retrieve the number of columns in a Pandas data frame? 【发布时间】:2013-12-16 08:00:01 【问题描述】:

如何以编程方式检索 pandas 数据框中的列数?我希望得到类似的东西:

df.num_columns

【问题讨论】:

我正在寻找一种解决方案,该解决方案还考虑在 groupby 操作后变成(多)索引的列。我想出了len(df.axes[0].names)+df.shape[1],但它看起来远非最佳。有任何想法吗?现在没有一个现有的答案可以解决这个问题。 @jangorecki 不过,这与这个问题完全没有关系。如果事物位于 DataFrame 的索引中,则它们被视为一列。虽然这似乎有点武断的区别,但对于某些操作,pandas 以不同的方式对待索引值和列系列 very。无论如何,您可以在 groupby 时阻止使用as_index=False 创建MultiIndex @ALollz 不将它们视为列这一事实只是 pandas 的特性,来自 SQL、R 和其他技术的工程师会期望分组列是列,而不是属性。 @jangorecki 一种简单的方法是len(df.reset_index().columns),因为 reset_index 会将所有索引转换为列。但正如@Aloltz 所说,这确实是一个独特的问题。我建议只用适当的样本数据集提出一个新问题,并在此处为接受的答案提供赏金。 【参考方案1】:

像这样:

import pandas as pd
df = pd.DataFrame("pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5])

len(df.columns)
3

【讨论】:

加上df.shape 给出一个带有(n_rows, n_columns)的元组 @mkln 如果您发布 df.shape[1] 作为答案,我会 +1。这是使用 numpy 的更好方法,值得单独回答。 完成。 @PhilCooper 也许您可以解释为什么 df.shape 更好?我的猜测是它不调用函数,只是从内存中读取属性?【参考方案2】:

替代方案:

df.shape[1]

df.shape[0]是行数)

【讨论】:

+1 因为我喜欢鼓励使用 martix 类型语法来寻址 numpy 和 pandas 对象。 (df.shape 与 len(df.columns))。说实话,如果您查看 pandas 的形状描述符,它会调用 len(df.columns) 但 numpy 数组和矩阵将它们作为属性。最有效的矢量化操作可以使用常规的 python 语法来完成,而不是矢量化操作,并且几乎总是错误的(numba/jit 操作除外)【参考方案3】:

如果保存数据帧的变量叫做df,那么:

len(df.columns)

给出列数。

对于那些想要行数的人:

len(df.index)

对于包含行数和列数的元组:

df.shape

【讨论】:

不会len(df) 给你行吗? @PadraicCunningham pandas 有很多容易忘记的快捷方式,所以我宁愿忽略它们,而是使用主要逻辑来解决问题。有时你可能会牺牲处理速度,但我更看重我的编码时间和代码可读性,而不是几秒钟的处理时间。在这种特殊情况下:如果您知道可以使用 len(df.index) 计算行数,那么下次您需要列数时,自然会使用 len(df.columns)。【参考方案4】:

很惊讶我还没有看到这个,所以不用多说,这里是:

df.columns.size

【讨论】:

【参考方案5】:

df.info() 函数将为您提供如下结果。 如果您使用的是 Pandas 的 read_csv 方法,不带 sep 参数或带“,”的 sep。

raw_data = pd.read_csv("a1:\aa2/aaa3/data.csv")
raw_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5144 entries, 0 to 5143
Columns: 145 entries, R_fighter to R_age

【讨论】:

【参考方案6】:

有多个选项可以获取列号和列信息,例如: 让我们检查一下。

local_df = pd.DataFrame(np.random.randint(1,12,size=(2,6)),columns =['a','b','c','d','e' ,'F']) 1. local_df.shape[1] --> Shape属性返回元组为(行&列)(0,1)。

    local_df.info() --> info 方法将返回有关数据框及其列的详细信息,例如列数、列的数据类型、 非空值计数,Data Frame 的内存使用情况

    len(local_df.columns) --> columns 属性将返回数据框列的索引对象,len 函数将返回可用列总数。

    local_df.head(0) --> 参数为 0 的 head 方法将返回 df 的第一行,实际上只是标题。

假设列数不超过 10。对于循环乐趣: li_count =0 对于 local_df 中的 x: li_count =li_count + 1 打印(li_count)

【讨论】:

【参考方案7】:

为了在您的总形状中包含行索引“列”的数量,我个人将df.columns.size 与属性pd.Index.nlevels/pd.MultiIndex.nlevels 的列数相加:

设置虚拟数据

import pandas as pd

flat_index = pd.Index([0, 1, 2])
multi_index = pd.MultiIndex.from_tuples([("a", 1), ("a", 2), ("b", 1), names=["letter", "id"])

columns = ["cat", "dog", "fish"]

data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat_df = pd.DataFrame(data, index=flat_index, columns=columns)
multi_df = pd.DataFrame(data, index=multi_index, columns=columns)

# Show data
# -----------------
# 3 columns, 4 including the index
print(flat_df)
    cat  dog  fish
id                
0     1    2     3
1     4    5     6
2     7    8     9

# -----------------
# 3 columns, 5 including the index
print(multi_df)
           cat  dog  fish
letter id                
a      1     1    2     3
       2     4    5     6
b      1     7    8     9

将我们的流程写成函数:

def total_ncols(df, include_index=False):
    ncols = df.columns.size
    if include_index is True:
        ncols += df.index.nlevels
    return ncols

print("Ignore the index:")
print(total_ncols(flat_df), total_ncols(multi_df))

print("Include the index:")
print(total_ncols(flat_df, include_index=True), total_ncols(multi_df, include_index=True))

打印出来:

Ignore the index:
3 3

Include the index:
4 5

如果您只想在索引为pd.MultiIndex 时包含索引的数量,那么您可以在定义的函数中加入isinstance 签入。

作为替代方案,您可以使用df.reset_index().columns.size 来获得相同的结果,但这不会那么高效,因为我们暂时将新列插入索引并在获取列数之前创建新索引。

【讨论】:

【参考方案8】:
#use a regular expression to parse the column count
#https://docs.python.org/3/library/re.html

buffer = io.StringIO()
df.info(buf=buffer)
s = buffer.getvalue()
pat=re.search(r"total\s1[0-9]\s1column",s)
print(s)
phrase=pat.group(0)
value=re.findall(r'[0-9]+',phrase)[0]
print(int(value))

【讨论】:

【参考方案9】:
import pandas as pd
df = pd.DataFrame("pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5])


print(len(list(df.iterrows())))

给出行的长度

3

[Program finished]

【讨论】:

【参考方案10】:

这里是:

pandas excel 引擎:xlsxwriter

获取列数的几种方法:

len(df.columns) -> 28 df.shape[1] -> 28 在这里:df.shape = (592, 28) 相关 行数:df.shape[0] -> 592 df.columns.shape[0] -> 28 这里:df.columns.shape = (28,) df.columns.size -> 28

【讨论】:

【参考方案11】:

这对我有用 len(list(df))。

【讨论】:

点评来源: 嗨,这篇文章似乎没有为问题提供quality answer。请编辑您的答案并改进它,或者将其作为评论发布。 不要那样做。它会创建一个新列表,浪费内存和速度。

以上是关于如何检索 Pandas 数据框中的列数?的主要内容,如果未能解决你的问题,请参考以下文章

将 WPF Datagrid 中的数据检索到 List 中的列数不同

在 pandas 数据框中检索 NaN 值的索引

如何从数据框中检索行名和列名?

如何在 Pandas 数据框中的特定位置插入一列? (更改熊猫数据框中的列顺序)

ipython notebook pandas max 允许的列数

如何判断 pandas 数据框中的列是不是为 datetime 类型?如何判断一列是不是为数字?