2016-04-06 63 views
7

Tôi đang cố tạo khung dữ liệu trống với chỉ mục và chỉ định các loại cột. Con đường tôi đang làm nó như sau:Tạo Dataframe trống trong Pandas chỉ định các loại cột

df = pd.DataFrame(index=['pbp'],columns=['contract', 
             'state_and_county_code', 
             'state', 
             'county', 
             'starting_membership', 
             'starting_raw_raf', 
             'enrollment_trend', 
             'projected_membership', 
             'projected_raf'], 
           dtype=['str', 'str', 'str', 'str', 'int', 'float', 'float', 'int', 'float']) 

Tuy nhiên, tôi nhận được lỗi sau,

TypeError: data type not understood 

này có nghĩa là gì?

+0

tôi don không nghĩ rằng bạn có thể chỉ định các dtypes theo cách này, bạn có thể vượt qua một loại duy nhất như 'str' nhưng không phải là một danh sách các chuỗi.Dtype sẽ được suy ra khi bạn chỉ định các giá trị cột.Tôi nghĩ rằng nó nên được không cần thiết để chỉ định tại tất cả – EdChum

+0

@EdChum đó là sự thật theo [docs] (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html), tôi tự hỏi, tại sao nó lại là hàm tạo không cho phép điều đó ... sẽ không hiệu quả hơn khi tạo một dataframe trống với các kiểu từ đầu cho allocati về mục đích? – jimijazz

Trả lời

2

gấu trúc không cung cấp cột số nguyên thuần túy. Bạn có thể sử dụng cột float và chuyển đổi cột đó thành số nguyên khi cần hoặc xử lý nó như một đối tượng. Những gì bạn đang cố gắng thực hiện không phải là cách gấu trúc được cho là được sử dụng. Nhưng nếu bạn thực sự muốn điều đó, bạn có thể nhận được xung quanh thông báo TypeError bằng cách làm điều này.

df1 = pd.DataFrame(index=['pbp'], columns=['str1','str2','str2'], dtype=str) 
df2 = pd.DataFrame(index=['pbp'], columns=['int1','int2'], dtype=int) 
df3 = pd.DataFrame(index=['pbp'], columns=['flt1','flt2'], dtype=float) 
df = pd.concat([df1, df2, df3], axis=1) 

    str1 str2 str2 int1 int2 flt1 flt2 
pbp NaN NaN NaN NaN NaN NaN NaN 

Bạn có thể sắp xếp lại thứ tự col theo ý muốn. Nhưng một lần nữa, đây không phải là cách mà gấu trúc được cho là được sử dụng.

df.dtypes 
str1  object 
str2  object 
str2  object 
int1  object 
int2  object 
flt1 float64 
flt2 float64 
dtype: object 

Lưu ý rằng int được coi là đối tượng.

+1

Bạn đang nói về cái quái gì vậy? Tất nhiên Pandas hỗ trợ cột nguyên. – user2357112

+0

Có vẻ như đã xảy ra sự cố khi chuyển 'dtype = int' mà không có dữ liệu. – user2357112

+0

Điều này hoàn toàn giống như một lỗi - vẫn là hành vi trong bản phát hành mới nhất. Bạn đã gửi nó chưa? – user48956

3

Hun đã trả lời là không thể. Vì vậy, chỉ là một nhận xét.

Bạn có thể khắc phục Type Lỗi sử dụng np.dtype:

pd.DataFrame(index = ['pbp'], columns = ['a','b'], dtype = np.dtype([('str','float')])) 

nhưng bạn sẽ có được thay vì:

NotImplementedError: compound dtypes are not implementedin the DataFrame constructor 
+0

Đây thực sự là câu trả lời đúng. Ngay cả sửa chữa TypeError, nó vẫn không phải là một cái gì đó mà gấu trúc làm phiền để thực hiện. Bạn thậm chí không thể sao chép một dtype từ một DataFrame hợp chất-dtype hiện có để bắt đầu một DataFrame trống mới, mà thực sự có vẻ giống như một trường hợp sử dụng hợp lệ. –

1

Tôi tìm thấy câu hỏi này sau khi chạy vào cùng một vấn đề. Tôi thích giải pháp sau (Python 3) để tạo một DataFrame trống với không có chỉ mục.

import numpy as np 
import pandas as pd 

def make_empty_typed_df(dtype): 
    tdict = np.typeDict 
    types = tuple(tdict.get(t, t) for (_, t, *__) in dtype) 
    if any(t == np.void for t in types): 
     raise NotImplementedError('Not Implemented for columns of type "void"') 
    return pd.DataFrame.from_records(np.array([tuple(t() for t in types)], dtype=dtype)).iloc[:0, :] 

kiểm tra này ra ...

from itertools import chain 

dtype = [('col%d' % i, t) for i, t in enumerate(chain(np.typeDict, set(np.typeDict.values())))] 
dtype = [(c, t) for (c, t) in dtype if (np.typeDict.get(t, t) != np.void) and not isinstance(t, int)] 

print(make_empty_typed_df(dtype)) 

Out:

Empty DataFrame 

Columns: [col0, col6, col16, col23, col24, col25, col26, col27, col29, col30, col31, col32, col33, col34, col35, col36, col37, col38, col39, col40, col41, col42, col43, col44, col45, col46, col47, col48, col49, col50, col51, col52, col53, col54, col55, col56, col57, col58, col60, col61, col62, col63, col64, col65, col66, col67, col68, col69, col70, col71, col72, col73, col74, col75, col76, col77, col78, col79, col80, col81, col82, col83, col84, col85, col86, col87, col88, col89, col90, col91, col92, col93, col95, col96, col97, col98, col99, col100, col101, col102, col103, col104, col105, col106, col107, col108, col109, col110, col111, col112, col113, col114, col115, col117, col119, col120, col121, col122, col123, col124, ...] 
Index: [] 

[0 rows x 146 columns] 

Và kiểu dữ liệu ...

print(make_empty_typed_df(dtype).dtypes) 

O ut:

col0  timedelta64[ns] 
col6    uint16 
col16    uint64 
col23    int8 
col24  timedelta64[ns] 
col25    bool 
col26   complex64 
col27    int64 
col29    float64 
col30    int8 
col31    float16 
col32    uint64 
col33    uint8 
col34    object 
col35   complex128 
col36    int64 
col37    int16 
col38    int32 
col39    int32 
col40    float16 
col41    object 
col42    uint64 
col43    object 
col44    int16 
col45    object 
col46    int64 
col47    int16 
col48    uint32 
col49    object 
col50    uint64 
       ...  
col144    int32 
col145    bool 
col146   float64 
col147  datetime64[ns] 
col148    object 
col149    object 
col150   complex128 
col151 timedelta64[ns] 
col152    int32 
col153    uint8 
col154   float64 
col156    int64 
col157    uint32 
col158    object 
col159    int8 
col160    int32 
col161    uint64 
col162    int16 
col163    uint32 
col164    object 
col165  datetime64[ns] 
col166   float32 
col167    bool 
col168   float64 
col169   complex128 
col170   float16 
col171    object 
col172    uint16 
col173   complex64 
col174   complex128 
dtype: object 

Thêm một chỉ số được khôn lanh vì không có một giá trị thiếu đúng đối với hầu hết các loại dữ liệu để họ kết thúc việc đúc một số loại khác có giá trị thiếu tự nhiên (ví dụ, int s được đúc đến float s hoặc object s), nhưng nếu bạn có dữ liệu đầy đủ về các loại bạn đã chỉ định, thì bạn luôn có thể chèn các hàng nếu cần và các loại của bạn sẽ được tôn trọng. Điều này có thể được thực hiện với:

df.loc[index, :] = new_row 

Một lần nữa, như @Hun đã chỉ ra, điều này KHÔNG biết cách sử dụng Pandas.

0

Bạn có thể làm điều này bằng cách thông qua một cuốn từ điển vào constructor DataFrame:

df = pd.DataFrame(index=['pbp'], 
        data={'contract' : np.full(1, "", dtype=str), 
         'starting_membership' : np.full(1, np.nan, dtype=float), 
         'projected_membership' : np.full(1, np.nan, dtype=int) 
         } 
       ) 

này sẽ đúng cung cấp cho bạn một dataframe trông giống như:

 contract projected_membership starting_membership 
pbp  ""    NaN   -9223372036854775808 

Với dtypes:

contract     object 
projected_membership float64 
starting_membership  int64 

Điều đó nói rằng, có hai điều cần lưu ý:

1) str không thực sự là loại mà cột DataFrame có thể xử lý; thay vào đó nó rơi trở lại trường hợp chung object. Nó vẫn hoạt động bình thường.

2) Tại sao bạn không thấy NaN dưới starting_membership? Vâng, NaN chỉ được xác định cho phao nổi; không có giá trị "Không" cho các số nguyên, do đó, nó giả định np.NaN thành một số nguyên. Nếu bạn muốn có giá trị mặc định khác, bạn có thể thay đổi giá trị đó trong cuộc gọi np.full.

+0

Không cần phải đặt một loạt dữ liệu giả trong các cột khi bạn có thể sử dụng các mảng trống. – user2357112

1

Điều này thực sự có mùi giống như một lỗi.

Đây là giải pháp khác (đơn giản hơn).

def df_empty(columns, dtypes, index=None): 
    df = pd.DataFrame(index=index) 
    for c,d in zip(columns, dtypes): 
     df[c] = pd.Series(dtype=d) 
    return df 

df = df_empty ([ 'a', 'b'], dtypes = [np.int64, np.int64,] danh sách in (df.dtypes) # Int64, Int64

Các vấn đề liên quan