2016-08-25 42 views
2

我想知道是否有一種方法在使用數據框的列時使用索引值。假設我有DF喜歡:熊貓:在列上使用函數中的索引值

col1 col2 
0 a [0,1,2] 
1 b [0,2] 
2 c [0,1,2] 

我想寫上df.col2的應用功能,使得它從列表中刪除在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
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) 

enter image description here

+0

對不起索引值並不總是列表的第一個元素。我應該在我的示例df中更加詳盡,並相應地進行了更新。 – Fizi

+0

如果索引不存在於列表中,這會拋出一個錯誤嗎?對不起,我試圖在我的代碼中設置它,但只是想檢查 – Fizi

+0

謝謝我已更新問題 – Fizi

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] 
+0

這似乎是一個更直觀的響應,但是當我運行代碼時,我得到的都是無。 – Fizi

+0

謝謝。你所做的改變完美:) – Fizi

+0

早期的版本實際上只是打印一大堆'None'(因爲移除一個元素的結果其實是'None'),但是'DataFrame'本身會被更新。更新後的答案反過來會產生一個奇怪的'None'和'False'混合,但它可能更直觀一些。 – fuglede

0

也許你可以試試這個,這不會刪除列表中的索引值噸將與「南」代替它

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]