2013-08-23 86 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])',因为在这个用例中我不再需要索引了;我很好奇我是否可以在“熊猫”中管理。 –