对于 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
所以我得到一个 DataFrame
而不是一系列的对(即 [(10,2), (10,1), (20,2)]
).
我怎样才能强制 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)
请不要这样做。
两列将为您提供更好的性能、灵 active 和便于日后分析。
只是为了更新 OP 的经验:
我们想要的是计算每个 [0, 1] 对的出现次数。
在系列中,他们可以使用 value_counts
方法(使用上述结果中的列)。但是,使用 groupby 可以获得相同的结果。发现速度快了 300 倍(对于 OP):
df2.groupby([0, 1]).size()
值得(再次)强调的是,[11]
必须为每一行创建一个 Series 对象和一个元组实例,相比之下,这是一个巨大的开销到 groupby 的那个。
Tôi là một lập trình viên xuất sắc, rất giỏi!