Pandas DataFrame의 구조(데이터가 아닌)만 복사할 수 있는 방법이 있습니까?
어디선가 DataFrame을 받았는데 같은 숫자와 열과 행(인덱스)의 이름을 가진 다른 DataFrame을 만들고 싶습니다.예를 들어, 원래 데이터 프레임이 다음과 같이 생성되었다고 가정합니다.
import pandas as pd
df1 = pd.DataFrame([[11,12],[21,22]], columns=['c1','c2'], index=['i1','i2'])
열과 이름을 명시적으로 정의하여 구조를 복사했습니다.
df2 = pd.DataFrame(columns=df1.columns, index=df1.index)
데이터를 복사하고 싶지 않습니다. 그렇지 않으면 그냥 쓸 수 있습니다.df2 = df1.copy()
. 즉, df2가 생성된 후에는 NaN 요소만 포함해야 합니다.
In [1]: df1
Out[1]:
c1 c2
i1 11 12
i2 21 22
In [2]: df2
Out[2]:
c1 c2
i1 NaN NaN
i2 NaN NaN
더 관용적인 방법이 있습니까?
이 일은 원래 일부터 시작해요
df1 = pd.DataFrame([[11, 12], [21, 22]], columns=['c1', 'c2'], index=['i1', 'i2'])
빈 DataFrame을 구성하고 df1과 같이 재인덱스합니다.
pd.DataFrame().reindex_like(df1)
Out:
c1 c2
i1 NaN NaN
i2 NaN NaN
팬더 버전 0.18에서 DataFrame 생성기는 값 대신 NaN으로 다른 데이터프레임과 같은 데이터프레임을 생성할 수 있는 옵션이 없습니다.
사용하는 코드df2 = pd.DataFrame(columns=df1.columns, index=df1.index)
이것은 가장 논리적인 방법이고, 그것을 개선할 수 있는 유일한 방법은 당신이 하고 있는 일을 훨씬 더 많이 말하는 것입니다. 그것은 당신이 하고 있는 일을 추가하는 것입니다.data=None
, 따라서 다른 코드 작성자가 작성 중인 이 새 DataFrame의 데이터를 의도적으로 누락하는 것을 직접 확인할 수 있습니다.
그래서 제 제안은 다음과 같습니다.
명시적인 것이 암시적인 것보다 낫습니다.
df2 = pd.DataFrame(data=None, columns=df1.columns, index=df1.index)
당신 것과 비슷하지만, 좀 더 철자가 정확합니다.
이 질문에 정확히 대답하는 것이 아니라, 검색 엔진을 통해 이곳에 오는 사람들에게도 비슷한 질문입니다.
제 경우는 데이터 프레임과 인덱스가 없는 데이터 프레임의 복사본을 만드는 것이었습니다.사람은 다음과 같이 함으로써 이를 달성할 수 있습니다.이렇게 하면 열의 dtype이 유지됩니다.
empty_copy = df.drop(df.index)
몇 가지 샘플 데이터로 시작해 보겠습니다.
In [1]: import pandas as pd
In [2]: df = pd.DataFrame([[1, 'a'], [2, 'b'], [3, 'c']],
...: columns=['num', 'char'])
In [3]: df
Out[3]:
num char
0 1 a
1 2 b
2 3 c
In [4]: df.dtypes
Out[4]:
num int64
char object
dtype: object
이제 간단한 것을 사용해 보겠습니다.DataFrame
원본의 열을 사용하여 초기화DataFrame
데이터를 제공하지 않음:
In [5]: empty_copy_1 = pd.DataFrame(data=None, columns=df.columns)
In [6]: empty_copy_1
Out[6]:
Empty DataFrame
Columns: [num, char]
Index: []
In [7]: empty_copy_1.dtypes
Out[7]:
num object
char object
dtype: object
보시다시피 열 데이터 유형이 원본과 같지 않습니다.DataFrame
.
그래서, 열을 보존하려면dtype
...
열 데이터 유형을 보존하려면 다음을 구성해야 합니다.DataFrame
하나.Series
한때에
In [8]: empty_copy_2 = pd.DataFrame.from_items([
...: (name, pd.Series(data=None, dtype=series.dtype))
...: for name, series in df.iteritems()])
In [9]: empty_copy_2
Out[9]:
Empty DataFrame
Columns: [num, char]
Index: []
In [10]: empty_copy_2.dtypes
Out[10]:
num int64
char object
dtype: object
간단한 대안 - 먼저 데이터 유형이 있는 기본 구조 또는 인덱스와 열을 원래 데이터 프레임(df1)에서 df2로 복사합니다.
df2 = df1.iloc[0:0]
그런 다음 데이터 프레임을 빈 행(실제 구조와 더 잘 일치하도록 조정해야 하는 의사 코드)으로 채웁니다.
s = pd.Series([Nan,Nan,Nan], index=['Col1', 'Col2', 'Col3'])
df1의 행을 순환합니다.
df2 = df2.append(s)
을 과 을 할 하려면 할 을 과 을 pd.DataFrame(columns=df1.columns).astype(df1.dtypes)
import pandas as pd
df1 = pd.DataFrame(
[
[11, 12, 'Alice'],
[21, 22, 'Bob']
],
columns=['c1', 'c2', 'c3'],
index=['i1', 'i2']
)
df2 = pd.DataFrame(columns=df1.columns).astype(df1.dtypes)
print(df2.shape)
print(df2.dtypes)
출력:
(0, 3)
c1 int64
c2 int64
c3 object
dtype: object
간단히 할 수 있습니다.mask
타고notna()
예
df1 = pd.DataFrame([[11, 12], [21, 22]], columns=['c1', 'c2'], index=['i1', 'i2'])
df2 = df1.mask(df1.notna())
c1 c2
i1 NaN NaN
i2 NaN NaN
df 구조를 df2에 복사하는 간단한 방법은 다음과 같습니다.
df2 = pd.DataFrame(columns=df.columns)
: 0.22 에서 효과가 .df2 = pd.DataFrame(index=df.index.delete(slice(None)), columns=df.columns)
유형: :df2 = df2.astype(df.dtypes)
delete(slice(None))
인덱스 값을 유지하지 않으려는 경우.
이것이 오래된 질문이라는 것을 알지만, 저는 제 돈을 추가하려고 생각했습니다.
def df_cols_like(df):
"""
Returns an empty data frame with the same column names and types as df
"""
df2 = pd.DataFrame({i[0]: pd.Series(dtype=i[1])
for i in df.dtypes.iteritems()},
columns=df.dtypes.index)
return df2
은 Δ Δ Δ Δ Δ Δ Δ Δ 를 중심으로 합니다.df.dtypes
프레임의 ,력터의성,,df
, 이인pd.Series
.A.pd.DataFrame
는 빈빈로다됩니다 사전으로 됩니다.pd.Series
열과 열 을 지정한 는 입력 열 에서 것입니다.df
.
언급URL : https://stackoverflow.com/questions/27467730/is-there-a-way-to-copy-only-the-structure-not-the-data-of-a-pandas-dataframe
'prosource' 카테고리의 다른 글
성능 테스트 sql 쿼리 (0) | 2023.09.10 |
---|---|
로컬 파일에서 XSL 변환을 수행하도록 Chrome을 만들 수 있습니까? (0) | 2023.09.10 |
mysql select 쿼리를 사용하여 다음 행의 후속 열의 합계를 가져오는 방법 (0) | 2023.09.10 |
MariaDB: default 절에서 함수를 사용하는 방법? (0) | 2023.09.10 |
where 절의 mySQL regex (0) | 2023.09.10 |