2013-08-23 126 views
2

對於object數據I可以兩列映射到三分之一,(object)元組映射幾個數值列到元組的新列在熊貓

>>> import pandas as pd 
>>> df = pd.DataFrame([["A","b"], ["A", "a"],["B","b"]]) 
>>> df 
    0 1 
0 A b 
1 A a 
2 B b 

>>> df.apply(lambda row: (row[0], row[1]), axis=1) 
0 (A, b) 
1 (A, a) 
2 (B, b) 
dtype: object 

的柱(參見也Pandas: How to use apply function to multiple columns)。

但是,當我嘗試做同樣的事情數值列

>>> df2 = pd.DataFrame([[10,2], [10, 1],[20,2]]) 
df2.apply(lambda row: (row[0], row[1]), axis=1) 
    0  1 
0 10 2 
1 10 1 
2 20 2 

所以不是一系列對(即[(10,2), (10,1), (20,2)])我得到一個DataFrame

我該如何強制pandas實際獲得一系列配對? (最好,做起來不是轉換成字符串,然後解析更好。)

+0

以前的行爲似乎是一個錯誤(並在開發分支中修復,但不在0.12中)。 –

+0

爲什麼你需要一個「元組」的「系列」?把它作爲DataFrame中的兩列是非常靈活的。 –

+0

@PhillipCloud它不是爲了進一步存儲 - 只需要一個我有對的系列(所以我可以用series.value_counts()來爲配對進行統計 - 例如計算互信息)。 –

回答

4

我不建議這樣做,但你可以它:

In [11]: df2.apply(lambda row: pd.Series([(row[0], row[1])]), axis=1) 
Out[11]: 
     0 
0 (10, 2) 
1 (10, 1) 
2 (20, 2) 

請不要這樣做。

兩列將爲您提供更好的性能,靈活性和易於後續分析。

只是爲了與OP的經驗更新:

什麼是想要的是計算每個[0,1]對的發生。

在系列中,他們可以使用value_counts方法(從上面的結果列)。然而,同樣的結果可以用groupby達到和發現更快(對於OP)300倍:

df2.groupby([0, 1]).size() 

值得強調的是(再次)[11]必須爲每個Series對象和元組實例行,這是一個巨大的開銷相比groupby。

+0

+1不鼓勵使用此功能。 –

+0

@PhillipCloud我想知道是否應該更大的阻力...... –

+0

@AndyHayden謝謝。這不是爲了進一步分析 - 我只是想計算配對的分佈(例如計算互信息)。另一個選擇是使用'collections.Counter'和'map(lambda x,y:(x,y),df [0],df [1])',因爲在這個用例中我不再需要索引了;我很好奇我是否可以在「熊貓」中管理。 –