【发布时间】:2017-03-28 09:54:39
【问题描述】:
我在 pandas 数据框中有这个测试表
Leaf_category_id session_id product_id
0 111 1 987
3 111 4 987
4 111 1 741
1 222 2 654
2 333 3 321
这是我上一个问题的扩展,@jazrael 回答了这个问题。 view answer
所以在获得 product_id 列中的值后(只是一个假设,与我之前问题的输出略有不同,
|product_id |
---------------------------
|111,987,741,34,12 |
|987,1232 |
|654,12,324,465,342,324 |
|321,741,987 |
|324,654,862,467,243,754 |
|6453,123,987,741,34,12 |
等等, 我想创建一个新列,其中一行中的所有值都应该作为一个二元组,下一个是二元组,最后一个不是。在与第一个组合的行中,例如:
|product_id |Bigram
-------------------------------------------------------------------------
|111,987,741,34,12 |(111,987),**(987,741)**,(741,34),(34,12),(12,111)
|987,1232 |(987,1232),(1232,987)
|654,12,324,465,342,32 |(654,12),(12,324),(324,465),(465,342),(342,32),(32,654)
|321,741,987 |(321,741),**(741,987)**,(987,321)
|324,654,862 |(324,654),(654,862),(862,324)
|123,987,741,34,12 |(123,987),(987,741),(34,12),(12,123)
忽略**(稍后我会告诉你我为什么加星标)
实现二元组的代码是
for i in df.Leaf_category_id.unique():
print (df[df.Leaf_category_id == i].groupby('session_id')['product_id'].apply(lambda x: list(zip(x, x[1:]))).reset_index())
从这个 df 中,我想考虑二元列并再制作一个名为频率的列,这给了我二元出现的频率。
注意*:(987,741) 和 (741,987) 被视为相同,应删除一个重复条目,因此 (987,741) 的频率应为 2。 (34,12) 的情况类似,它出现两次,所以频率应该是 2
|Bigram
---------------
|(111,987),
|**(987,741)**
|(741,34)
|(34,12)
|(12,111)
|**(741,987)**
|(987,321)
|(34,12)
|(12,123)
最终结果应该是。
|Bigram | frequency |
--------------------------
|(111,987) | 1
|(987,741) | 2
|(741,34) | 1
|(34,12) | 2
|(12,111) | 1
|(987,321) | 1
|(12,123) | 1
我希望在这里找到答案,请帮助我,我已经尽可能详细了。
【问题讨论】:
-
您希望如何存储频率?在一行中,
Bigram列将包含多个元组,因此会有多个频率。 -
@James :一行中的每个元组都应该作为一个新行,如倒数第二个表所示。然后如果有重复的表,正如我提到的,频率应该相应地改变
-
所以
Bigram和frequency在单独的数据框中? -
@James:df 中只有二元组,您将通过我发布的代码得到它。我想创建一个名为 frequency 的新列,它计算单个二元组的出现次数。
-
@jezrael 你能看看这个问题吗?
标签: python python-2.7 python-3.x pandas