通过pandas DataFrame循环时出现意外结果

时间:2017-08-28 20:55:22

标签: 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

他们应该是一样的,我无法理解为什么他们不一样。我会赞美任何帮助。

1 个答案:

答案 0 :(得分:2)

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)

为了抓取形状元组,它相当于抓住len df.indexdf.column的{​​{1}}。避免使用values来获取shape属性,因为形成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)