将几个数字列映射到Pandas中的新元组列

时间:2013-08-23 00:46:42

标签: python pandas

对于object数据,我可以将两列映射到元组的第三列(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实际获得一系列配对? (最好是比转换为字符串然后解析更好。)

1 个答案:

答案 0 :(得分: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可以获得相同的结果,并且发现速度提高了300倍(对于OP):

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

值得强调(再次)[11]必须为每一行创建一个Series对象和一个元组实例,与groupby相比,这是一个巨大的开销。