我想知道是否有人可以帮助我找到问题的解决方案;我基本上有一个pandas系列列表(空格分隔),我使用pandas对系列的字符串操作创建 - str.split(' ')
。我需要创建另一系列列表,这些列表是每个列表与另一个列表的交集。
我认为apply()在这里是缺失的部分,但我的使用必须是错误的,因为我收到错误。在pandas手册中没有真正涵盖apply()中的set操作,但我认为它应该可行吗?
基本上,我有一组事件(evector),并且想要设置一个向量,其中事件与给定事件共享用户(e2)。 到目前为止,这些都是我的方法:
原始尝试:
evector = attendframe.yes.str.split(' ') #creates the series of lists
e2 = [attendframe.yes[attendframe.event==686467261]] #just for testing - returns [0
# 1975964455 252302513 4226086795 3805886383 142...
#Name: yes]
sharedvector = evector.apply(lambda x: [n for n in [x] if n in e2]) # the important bit
print sharedvector
错误: 数组的长度不同:1对7
我将问题缩小到以下几行:
evector = attendframe.yes.str.split(' ').apply(lambda x: set([x]))
尝试1
evector = attendframe.yes.str.split(' ').apply(lambda x: set([x]))
#Unhashable type "list"
尝试2
evector = attendframe.yes.str.split(' ').apply(lambda x: set(x))
#TypeError: 'float' object is not iterable
尝试3 (感谢Andy Hayden)
evector = attendframe.yes.str.split(' ').apply(lambda x: x
if isinstance(x, float)
else set(x))
e2 = set([2394228942, 2686116898, 1056558062, 379294223])
sharedvector = evector.apply(lambda x: x if isinstance(x, float) else x.intersection(e2))
sharedvector.dropna())
#works, but returns empty arrays.
以下是导致问题的数据本身示例:
print attendframe.yes.str.split(' ')
0 [1975964455, 252302513, 4226086795, 3805886383...
1 [2394228942, 2686116898, 1056558062, 379294223...
2 NaN
3 NaN
如果它与最终解决方案有任何关系,我最终想创建一个数据帧,其边距包含事件,其单元格包含任意两个给定事件之间共享的用户列表。生成列向量是第一部分,然后我希望在函数中运行类似的apply()步骤来创建完整的矩阵。
答案 0 :(得分:1)
由于您询问集合操作,为什么不使用set
个对象:
evector = attendframe.yes.str.split(' ').apply(set)
e2 = set(attendframe[attendframe.event==686467261]]['yes'])
并应用集合交集:
sharedvector = evector.apply(lambda x: x & e2)
如果您的数据有NaN
,您可以将每个集合调用包装起来测试它是否为浮点数:
evector = df.yes.str.split(' ').apply(lambda x: x
if isinstance(x, float)
else set(x))
e2 = set(attendframe[attendframe.event==686467261]]['yes'])
sharedvector = evector.apply(lambda x: x if isinstance(x, float) else x & e2)