我想知道在数据帧的列上使用apply时是否有使用索引值的方法。假设我有df喜欢:
col1 col2
0 a [0,1,2]
1 b [0,2]
2 c [0,1,2]
我想在df.col2上编写一个apply函数,以便从col2中的列表中删除索引值,留下df,如:
col1 col2
0 a [1,2]
1 b [0,2]
2 c [0,1]
索引值可能在列表中,也可能不在列表中。但如果它确实存在于列表中,则应将其删除。请注意,这不是实际的用例,但与我需要的类似。我有
df.col2.apply(lambda x: f(x))
并且在f(x)中我希望能够访问x的索引值(如果可能)或解决方法。 我知道df.apply()可以处理列值,df.index.map()可以处理索引。在Pandas中是否有一种方法将两者的用例结合在一个优雅的解决方案中。谢谢你的帮助。
更新:索引是一个整数值,它将以其连续整数的方式进行约束。 col2将包含每个索引的列表。我想检查索引是否在该列表中,如果它存在则将其从列表中删除。因此,对于行索引3,我们有列表[27,36,3,9,7]。我想从列表中删除3。该列表是无序的
答案 0 :(得分:4)
如果我理解你的问题,这应该可以胜任:
df.apply(lambda x: x.name in x.col2 and x.col2.remove(x.name), axis=1)
使用原始帖子中的示例:
In [226]: df
Out[226]:
col1 col2
0 a [0, 1, 2]
1 b [0, 2]
2 c [0, 1, 2]
In [227]: df.apply(lambda x: x.name in x.col2 and x.col2.remove(x.name), axis=1);
In [228]: df
Out[228]:
col1 col2
0 a [1, 2]
1 b [0, 2]
2 c [0, 1]
答案 1 :(得分:0)
def name_drop(x):
x_ = x.drop('col2')
_x = pd.Series(x.col2)
_x = _x[_x != x.name].tolist()
x = x_.append(pd.Series({'col2': _x}))
return x
df.apply(name_drop, axis=1)
答案 2 :(得分:0)
也许你可以试试这个,这不会从列表中删除索引值,但会用'nan'替换它
df = pd.DataFrame({'a':list('mno'),'b':[[1,2,3],[1,3,4],[5,6,2]]})
df1 = df.b.apply(pd.Series)
df['b'] = np.array(df1[df1.apply(lambda x: x!=df.index.values)]).tolist()
Out[111]: a b 0 m [1.0, 2.0, 3.0] 1 n [nan, 3.0, 4.0] 2 o [5.0, 6.0, nan]