在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:如何将函数应用于多列)。

然而,当我尝试对数字列做同样的事情时

>>> 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实际获得一系列对?(最好是,这样做比转换为字符串然后解析要好。)

我不建议这样做,但您可以强制执行:

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]对的出现次数。

在Series中,他们可以使用value_counts方法(使用上面结果中的列)。然而,使用groupby可以获得相同的结果,并且发现速度快300倍(对于OP):

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

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

最新更新