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