Python 在序列上设置操作

Python 在序列上设置操作,python,numpy,pandas,Python,Numpy,Pandas,我想知道是否有人能帮我想出一个解决问题的办法;我基本上有一系列pandas列表(空格分隔),我使用pandas在series-str.split(“”)上的字符串操作创建了这些列表。我需要创建另一系列列表,这些列表与另一个列表相交 我认为apply()是这里缺少的部分,但我的用法肯定不正确,因为我收到了一个错误。在apply()中使用set操作并不是pandas手册的真正内容,但我认为它应该是可以做到的 基本上,我有一组事件(evector),并希望设置一个向量,其中事件与给定事件(e2)共享用

我想知道是否有人能帮我想出一个解决问题的办法;我基本上有一系列pandas列表(空格分隔),我使用pandas在series-
str.split(“”)
上的字符串操作创建了这些列表。我需要创建另一系列列表,这些列表与另一个列表相交

我认为apply()是这里缺少的部分,但我的用法肯定不正确,因为我收到了一个错误。在apply()中使用set操作并不是pandas手册的真正内容,但我认为它应该是可以做到的

基本上,我有一组事件(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(归功于安迪·海登)

以下是导致问题的数据本身的示例:

print attendframe.yes.str.split(' ')

0     [1975964455, 252302513, 4226086795, 3805886383...
1     [2394228942, 2686116898, 1056558062, 379294223...
2                                                   NaN
3                                                   NaN

如果它与最终的解决方案有任何关系,我最终希望创建一个数据框架,其边距包含事件,其单元格包含任意两个给定事件之间共享的用户列表。生成列向量是其中的第一部分,然后我希望在函数中运行类似的apply()步骤来创建完整的矩阵。

既然您询问的是集合操作,为什么不使用对象:

并应用集合交点:

sharedvector = evector.apply(lambda x: x & e2)
如果您的数据具有
NaN
,则可以包装每个set调用以测试它是否为浮点:

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)

既然您询问的是集合操作,为什么不使用对象:

并应用集合交点:

sharedvector = evector.apply(lambda x: x & e2)
如果您的数据具有
NaN
,则可以包装每个set调用以测试它是否为浮点:

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)

嗨,安迪,我不这么认为,我现在不在电脑前检查,但从内存来看,它要么给了我一个错误,说明浮点不可写,要么类型不可散列。今晚我会确认的!嗨,安迪,正如我所怀疑的,我得到了“float”对象不可写”的回复。嗨,安迪,在我看到你的评论之前,我刚刚在前几行添加了,这有帮助吗?嗨,安迪,我不这么认为,我现在不在我的计算机前检查,但从内存来看,它要么给了我一个错误,说明float不可写,要么类型不可写。今晚我会确认的!嗨,安迪,正如我所怀疑的,我返回了“'float'对象不可编辑”。嗨,安迪,在我看到你的评论之前,我刚刚在前几行添加了,这有帮助吗?不幸的是,这一行还返回了一个错误“float不可编辑”。如果我在操作周围放置[]似乎也没有什么帮助:evector=[attendframe.yes.str.split('').apply(set),因为列表对象显然没有apply()函数。所以用numpy/pandas的说法,Nan算为浮点数?我稍微整理了一下您的代码:
evector=attendframe.yes.str.split(“”).apply(lambda x:x如果是持续(x,float)else set(x))e2=attendframe[attendframe.event==686467261]['yes'].apply(lambda x:x如果是持续(x,float)else set)sharedvector=evector.apply(lambda x:x如果是instance(x,float)或者x&e2)
“不支持的操作数类型为&:'set'和'Series'
@analystic没有那么多,但是是的,那就是一个!抱歉,正在努力格式化注释中的代码。。。我稍微整理了一下你的代码:
evector=attendframe.yes.str.split(“”).apply(lambda x:x如果isinstance(x,float)else set(x))e2=attendframe[attendframe.event==686467261]['yes'].apply(lambda x:x如果isinstance(x,float)else set)sharedvector=evector.apply(lambda x:x如果isinstance(x,float)else x&e2)
仍然收到一个错误:“不支持的操作数类型(&:'set'和'Series')这是一个错误,很抱歉,e2应该是一个集合,已编辑。抱歉搞砸了!不幸的是,这也给了我一个错误“float是不可编辑的”。如果我在操作周围放置[]似乎也没有什么帮助:evector=[attendframe.yes.str.split('').apply(set),因为列表对象显然没有apply()函数。所以用numpy/pandas的说法,Nan算为浮点数?我稍微整理了一下您的代码:
evector=attendframe.yes.str.split(“”).apply(lambda x:x如果是持续(x,float)else set(x))e2=attendframe[attendframe.event==686467261]['yes'].apply(lambda x:x如果是持续(x,float)else set)sharedvector=evector.apply(lambda x:x如果是instance(x,float)或者x&e2)
“不支持的操作数类型为&:'set'和'Series'
@analystic没有那么多,但是是的,那就是一个!抱歉,正在努力格式化注释中的代码。。。我稍微整理了一下你的代码:
evector=attendframe.yes.str.split(“”).apply(lambda x:x如果isinstance(x,float)else set(x))e2=attendframe[attendframe.event==686467261]['yes'].apply(lambda x:x如果isinstance(x,float)else set)sharedvector=evector.apply(lambda x:x如果isinstance(x,float)else x&e2)
仍然收到一个错误:“不支持的操作数类型(&:'set'和'Series')这是一个错误,很抱歉,e2应该是一个集合,已编辑。抱歉搞砸了!