python - 循环遍历 pandas DataFrame 时出现意外结果

标签 python pandas dataframe

我将 csv 的内容加载到数据框中。

data = pd.read_csv("census.csv")

然后我检查数据大小

print( data.size) --> 633108

然后我循环遍历 DataFrame

counter = 0
for index, row in data.iterrows():
    counter += 1

然后我再次检查计数器和数据大小。

print( counter) --> 45222
print( data.size) --> 633108

它们应该是相同的,我不明白为什么它们不一样。我会感谢任何帮助。

最佳答案

size 不是正确使用的属性。 size 是元素总数。

df = pd.DataFrame(np.zeros((3, 4)))
df.size

12
如果只有一列,

size 恰好是正确的

df.iloc[:, [0]].size

3

相反,使用df.shape[0]来获取行数

df.shape[0]

3

或者

len(df)

3

我更喜欢len(df),因为它的访问速度比df.shape[0]稍快

%timeit df.shape[0]
%timeit len(df)

1.58 µs ± 47.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
916 ns ± 21 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

您可以使用len(df.columns)将其复制到第二维

%timeit df.shape[1]
%timeit len(df.columns)

1.65 µs ± 67.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
679 ns ± 34.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

对于抓取形状元组,相当于抓取df.indexdf.columnlen。避免使用 valuesshape 属性,因为调用形成 values 数组的开销太大。当然,除非您需要该数组用于其他用途。

%timeit df.shape
%timeit df.values.shape
%timeit len(df), len(df.columns)

1.58 µs ± 75.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
5.78 µs ± 198 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
1.65 µs ± 35 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

关于python - 循环遍历 pandas DataFrame 时出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45927228/

相关文章:

python - 我可以在方法链中使用 pd.drop 来删除特定行吗?

python - 使用 Pandas 基于正则表达式分离列数据

python - Django 只从模型中添加一个字段

python - 在 Python 中向下舍入日期时间对象

python - 如何在 float 列中填充 0.00 值(如 ffill 或 bfill)?

python - 读取具有可变长度字符串的文件时,pandas.read_csv 变慢

python - 用dask对非常大的数据进行排序?

python - 快速从txt读写时,如何防止IO权限被拒绝

python - 在 Unix 中为 Python 安装命名以及 shebang 的良好使用

python - 从按列排序的方阵中获取下对角线索引