对于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
实际获得一系列配对? (最好是比转换为字符串然后解析更好。)
答案 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)
两列将为您提供更好的性能,灵活性和以后分析的便利性。
想要的是计算每个[0,1]对的出现次数。
在系列中,他们可以使用value_counts
方法(使用上面结果中的列)。但是,使用groupby可以获得相同的结果,并且发现速度提高了300倍(对于OP):
df2.groupby([0, 1]).size()
值得强调(再次)[11]
必须为每一行创建一个Series对象和一个元组实例,与groupby相比,这是一个巨大的开销。