2

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

4

1 回答 1

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 相比,这是一个巨大的开销。

于 2013-08-23T00:55:41.060 回答