如何检索 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 数据框中的特定位置插入一列? (更改熊猫数据框中的列顺序)