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.