prosource

Pandas DataFrame의 구조(데이터가 아닌)만 복사할 수 있는 방법이 있습니까?

probook 2023. 9. 10. 12:23
반응형

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

반응형