2016-02-02 64 views
2

我是Python的新手,我很困惑所有這些數據類型,如系列,數組,列表等。這可能是一個非常開放的問題。我希望在使用python進行數據分析編碼時能夠了解一般實踐。如何處理熊貓和numpy在一起的系列和數組?

大量的讀數表明,numpy和pandas是我需要進行數據分析的兩個模塊。然而,我發現它很難操作/生成兩種不同數據類型的數據,即Series和Array。在進行任何類型的數據操作之前,需要將任何一種數據類型轉換爲另一種數據類型是否正常/自然?希望你知道你會做什麼?非常感謝。

例如:

import pandas as pd 
import numpy as np 

# create some data 
df = pd.DataFrame(np.random.randn(10, 3), columns=['a', 'b', 'c']) 
x = np.random.randn(10, 1) 

# data manipulation 
A = df['a'] 

# Question 1: 
# If I want to perform a element by element addition between x and A 
# How should I do? Simple x + A doesn't work but it seems strange to 
# me that if I have to convert the data type everytime 

# Question 2: 
# I'd like to combine to two columns together 
# concatenate or hstack both don't work 
+0

你想獲得'numpy.arrays'或'pd.Series'和'pd.Dataframes'? –

+0

我假設我想在數據框開始的時候結束數據框(因爲我使用熊貓導入數據)。基本上,我發現它們彼此不兼容(這兩個模塊)令人討厭,並且懷疑我是否處於正確的方向(幾乎每次操作都需要額外的步驟/功能)。 – Lafayette

回答

1

是正常/自然是一個需要任何數據操作之前,無論是 類型的數據的一個轉換到另一個?

有時你需要,有時你不需要。如有疑問,請執行。

也就是說,記住的Python禪:

  • 明確優於隱式。
  • 面對歧義,拒絕猜測的誘惑。

即使一些API會盡最大努力爲您轉換類型(numpy和pandas相當不錯),顯式類型轉換可以使您的代碼更具可讀性並且更易於調試。

問題1: 如果我想通過x和A之間的元素加法來執行元素,我應該怎麼做?簡單的x + A不起作用,但對我來說似乎很奇怪,如果我必須每次都要轉換數據類型

在這種情況下,您不必轉換數據類型,但需要兼容形狀。

>>> print(A.shape) 
(10,) 
>>> print(x.shape) 
(10, 1) 
>>> print(A + x.reshape(10)) 
0 -0.207131 
1 -2.117012 
2 0.925545 
3 -2.187705 
4 1.226458 
5 2.144904 
6 -0.956781 
7 1.956246 
8 0.060132 
9 1.332417 
Name: a, dtype: float64 

問題2:我想結合兩列串連在一起,或兩者hstack不工作

目前尚不清楚所需的輸出是什麼,但我認爲這是再次是形狀的問題,而不是類型。這裏有一個選項熊貓的方式:

>>> print(pd.concat([A, pd.Series(x.reshape(10))], axis=1)) 
      a   0 
0 -0.158667 -0.048463 
1 -0.847246 -1.269765 
2 -0.128232 1.053778 
3 -1.316113 -0.871593 
4 1.057044 0.169414 
5 3.188343 -1.043439 
6 -0.032524 -0.924257 
7 1.412443 0.543803 
8 -0.730386 0.790519 
9 0.289796 1.042621 
2

對於另外您arrays/Series應與同尺寸:

In [98]: A.shape 
Out[98]: (10,) 

In [99]: x.shape 
Out[99]: (10, 1) 

你可以施放reshape(-1)到矢量轉換爲數組:

In [100]: x.reshape(-1).shape 
Out[100]: (10,) 

然後你可以加上pd.Series答:

In [61]: A + x.reshape(-1) 
Out[61]: 
0 -1.186957 
1 -0.165563 
2 0.882490 
3 4.544357 
4 2.698414 
5 0.396110 
6 -0.199209 
7 3.282942 
8 2.448213 
9 -0.543727 
Name: a, dtype: float64 

對於你需要重塑你的A Series爲矢量您的第二個問題。你可以用reshape做到這一點:

In [97]: np.hstack([A.values.reshape(A.size,1), x]) 
Out[97]: 
array([[ 0.3158111 , -1.50276813], 
     [-1.09532212, 0.92975954], 
     [-0.77048623, 1.65297592], 
     [ 2.14690242, 2.39745455], 
     [ 1.63367806, 1.06473634], 
     [ 0.09134512, 0.3047644 ], 
     [ 0.02019805, -0.21940726], 
     [ 0.87008192, 2.41286007], 
     [ 1.25315724, 1.19505578], 
     [-0.60156045, 0.05783343]]) 

如果你想獲得pd.DataFrame你可以使用pd.concat

In [108]: pd.concat([A, pd.Series(x.reshape(-1))], axis=1) 
Out[108]: 
      a   0 
0 0.315811 -1.502768 
1 -1.095322 0.929760 
2 -0.770486 1.652976 
3 2.146902 2.397455 
4 1.633678 1.064736 
5 0.091345 0.304764 
6 0.020198 -0.219407 
7 0.870082 2.412860 
8 1.253157 1.195056 
9 -0.601560 0.057833 

編輯

docsreshape(-1)

newshape整數或整數的整數
新的形狀應該與原始形狀兼容。如果是整數,那麼結果將是該長度的一維數組。一個形狀尺寸可以是-1。在這種情況下,該值是從數組長度和剩餘維度推斷出來的。

+0

.reshape(-1)做/是什麼意思?謝謝 – Lafayette

+0

編輯回答 –

+0

@Lafayette指出,'reshape(-1)'可以用於任何原始數組的形狀,而'reshape(10)'只能用於10號大小的矢量。 –