0으로 채워진 팬더 데이터 프레임 만들기


105

주어진 크기의 0으로 채워진 팬더 데이터 프레임을 만드는 가장 좋은 방법은 무엇입니까?

나는 사용했다 :

zero_data = np.zeros(shape=(len(data),len(feature_list)))
d = pd.DataFrame(zero_data, columns=feature_list)

더 나은 방법이 있습니까?


1
아니, 나는 그것에 대한 실질적인 개선을 생각할 수 없다.
Dan Allan

데이터가 큰 집합이므로 np.zeros에서 메모리 오류가 발생합니다. 내가 할 수있는 일에 대한 힌트가 있습니까? "MemoryError"를 제외하고는 다른 출력이 없습니다. 100GB의 RAM이 있고 데이터는 20GB에 불과하지만 여전히 실패합니다. 64 비트 우분투 서버를 디버깅하는 방법을 모릅니다. 나는 조금 봤지만 모두가 말한다-덩어리로 나누지 만이 데이터는 나눌 수 없다.
niedakh

함께 일할 수 있습니까 data? 그것을 유지하기 위해 다른 구조를 만들어야하는 이유는 무엇입니까?
Phillip Cloud

답변:


144

이것을 시도 할 수 있습니다.

d = pd.DataFrame(0, index=np.arange(len(data)), columns=feature_list)

2
이것을 테스트하려면 %timeit temp = np.zeros((10, 11)); d = pd.DataFrame(temp, columns = ['col1', 'col2',...'col11'])156 명이 필요합니다. 하지만 %timeit d = pd.DataFrame(0, index = np.arange(10), columns = ['col1', 'col2',...'col11'])171 명이 필요합니다. 더 빠르지 않다는 것이 놀랍습니다.
emschorsch

3
0을 포함하도록 d.set_value(params)초기화 한 후 같은 작업을 수행 할 경우 int / float 문제가 발생할 수 있습니다 d. 쉬운 수정은 다음과 같습니다 d = pd.DataFrame(0.0, index=np.arange(len(data)), columns=feature_list).
ximiki

30

내 의견으로는 numpy로 이것을하는 것이 가장 좋습니다.

import numpy as np
import pandas as pd
d = pd.DataFrame(np.zeros((N_rows, N_cols)))

1
이렇게하면 "0"값을 변경할 수 없습니다. TypeError: 'numpy.float64' object does not support item assignment
RightmireM

@RightmireM 정확히 어떻게 변경하려고합니까? 당신이 맞습니다, 데이터 유형은np.float64
AlexG

11

@Shravan과 비슷하지만 numpy를 사용하지 않습니다.

  height = 10
  width = 20
  df_0 = pd.DataFrame(0, index=range(height), columns=range(width))

그런 다음 원하는대로 할 수 있습니다.

post_instantiation_fcn = lambda x: str(x)
df_ready_for_whatever = df_0.applymap(post_instantiation_fcn)

8

새 데이터 프레임이 기존 데이터 프레임과 동일한 인덱스 및 열을 갖도록하려면 기존 데이터 프레임에 0을 곱하면됩니다.

df_zeros = df * 0

2
df에 NaN이 포함되어 있으면 0 대신 NaN이 표시됩니다.
kadee

1

이미 데이터 프레임이있는 경우 다음이 가장 빠른 방법입니다.

In [1]: columns = ["col{}".format(i) for i in range(10)]
In [2]: orig_df = pd.DataFrame(np.ones((10, 10)), columns=columns)
In [3]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
10000 loops, best of 3: 60.2 µs per loop

비교 :

In [4]: %timeit d = pd.DataFrame(0, index = np.arange(10), columns=columns)
10000 loops, best of 3: 110 µs per loop

In [5]: temp = np.zeros((10, 10))
In [6]: %timeit d = pd.DataFrame(temp, columns=columns)
10000 loops, best of 3: 95.7 µs per loop

1

여기에 0 값을 입력하여 복사하려는 템플릿 DataFrame이 있다고 가정합니다.

데이터 세트에 NaN이없는 경우 0을 곱하면 훨씬 빠를 수 있습니다.

In [19]: columns = ["col{}".format(i) for i in xrange(3000)]                                                                                       

In [20]: indices = xrange(2000)

In [21]: orig_df = pd.DataFrame(42.0, index=indices, columns=columns)

In [22]: %timeit d = pd.DataFrame(np.zeros_like(orig_df), index=orig_df.index, columns=orig_df.columns)
100 loops, best of 3: 12.6 ms per loop

In [23]: %timeit d = orig_df * 0.0
100 loops, best of 3: 7.17 ms per loop

개선은 DataFrame 크기에 따라 다르지만 속도가 느리다는 것을 알 수 없습니다.

그리고 그것을 위해 :

In [24]: %timeit d = orig_df * 0.0 + 1.0
100 loops, best of 3: 13.6 ms per loop

In [25]: %timeit d = pd.eval('orig_df * 0.0 + 1.0')
100 loops, best of 3: 8.36 ms per loop

그러나:

In [24]: %timeit d = orig_df.copy()
10 loops, best of 3: 24 ms per loop

편집하다!!!

float64를 사용하는 프레임이 있다고 가정하면 이것은 엄청난 차이로 가장 빠를 것입니다! 0.0을 원하는 채우기 번호로 대체하여 모든 값을 생성 할 수도 있습니다.

In [23]: %timeit d = pd.eval('orig_df > 1.7976931348623157e+308 + 0.0')
100 loops, best of 3: 3.68 ms per loop

취향에 따라 외부 적으로 nan을 정의하고 특정 플로트 유형에 관계없이 일반적인 솔루션을 수행 할 수 있습니다.

In [39]: nan = np.nan
In [40]: %timeit d = pd.eval('orig_df > nan + 0.0')
100 loops, best of 3: 4.39 ms per loop

1
이것은 확실히 타이밍에 대한 가장 포괄적 인 대답이지만, OP의 경우 메모리 요구 사항이 속도가 아니라 문제인 것 같습니다 ... 그건 그렇고, 내 시스템에서 작성한 처음 두 제안은 동일한 타이밍을 제공합니다 (Pandas 0.20.3 ), 그래서 아마도 약간의 변화가 있었을 것입니다.
Moot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.