Python& Pandas - dp.Series int32和int64之间的区别

时间:2017-09-15 13:06:42

标签: python pandas numpy data-analysis

我开始学习python,numpy和panda,我有一个关于尺寸的基本问题。

请参阅下一个代码块:

1。长度:6,dtype:int64

private ChildEventListener mChildEventListener;
private ChildEventListener mChildEventListener2;

List<ChatMessage> ChatMessages = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
      ...
mMessageAdapter = new MessageAdapter(this, R.layout.item_message_sent, ChatMessages);
mMessageListView.setAdapter(mMessageAdapter);

 mChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                if(i == 0) {
                    current_last_key = dataSnapshot.getKey();
                }
                else {
                    ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
                    mMessageAdapter.add(chatMessage);
                }
                i++;
            }
          ...
        };
        Query messagesQuery =  mDatabaseReference.child("chat_messages").
                child(chatId).limitToLast(25);
        messagesQuery.addChildEventListener(mChildEventListener);
          ...
   }

 @Override
public void onClick(View v) {
    j = 0;
    mChildEventListener2 = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            if(!dataSnapshot.getKey().equals(current_last_key)) {
                if (j == 0) {
                    current_last_key = dataSnapshot.getKey();
                }
                else {
                    ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
                    ChatMessages.add(j- 1, chatMessage);
                }

            }
            else
            {
                ChatMessage chatMessage = dataSnapshot.getValue(ChatMessage.class);
                ChatMessages.add(0 , chatMessage);
                loadMoreTextView.setVisibility(View.GONE);
            }
            mMessageAdapter.notifyDataSetChanged();
            j++;
        }

        ...        };
    Query query = mDatabaseReference.child("chat_messages").
            child(chatId).orderByKey().endAt(current_last_key).limitToLast(10);
    query.addChildEventListener(mChildEventListener2);
}

VS

2。长度:6,dtype:int32

# create a Series from a dict
pd.Series({key: value for key, value in zip('abcdef', range(6))})

问题 所以我认为当你在pd.Series中放置一个列表,numpy数组,字典等时你会得到int64但是当你在pd.Series中只放置范围(6)时你会得到int32。有人可以让我对此有点清楚吗?

对不起这个非常基本的问题。

@Edit:我正在使用Pandas版本0.20.1和Numpy 1.12.1

1 个答案:

答案 0 :(得分:4)

它们在语义上的不同之处在于,在第一个版本中,您传递带有单个标量值的dict,因此dtype变为int64,对于第二个版本,您传递range,可以进行常规转换到一个numpy数组,这是int32

In[57]:
np.array(range(6)).dtype

Out[57]: dtype('int32')

所以pandas series的构造涉及第一个实例中的dtype匹配而第二个实例没有匹配,因为它可以转换为numpy数组,而numpy确定在这种情况下首选int32 < / p>

<强>更新

看起来这取决于您的numpy版本和pandas版本。 我正在运行python 3.6,numpy 1.12.1和pandas 0.20.3,我得到了上面的结果。我也在运行Windows 7 64位

@jeremycg正在运行pandas 0.19.2numpy 1.11.2并观察到相同的结果,而@coldspeed正在运行numpy 1.13.1并观察int64

从中可以看出dtype很大程度上取决于numpy的作用。

我相信在这种情况下我们通过range时会调用此line

subarr = np.array(arr, dtype=object, copy=copy)

返回的类型由numpy和OS确定,在我的情况下,windows已将C Long定义为32位。请参阅相关内容:numpy array dtype is coming as int32 by default in a windows 10 64 bit machine