2017-07-08 28 views
2

我如何可以從列表中列上創建一個新的列表列熊貓:如何檢查是否列表類型列在數據幀

我的數據框:

id x list_id 
1  20 [2, 4] 
2  10 [1, 3] 
3  10 [1] 
4  30 [1, 2] 

我想要什麼:

id x list_id list_x 
1  20 [2, 4]  [10, 30] 
2  10 [1, 3]  [20, 10] 
3  10 [1]  [20] 
4  30 [1, 2]  [20, 10] 

我的第一個想法是在每行迭代然後檢查ID在該列表中

for index, row in df.iterrows(): 
    if (df['id'].isin(row['list_id'])): 
    do_somthing 

但它不工作,任何建議!

+0

JECT陣列你是如何創造的呢?這取決於你想要做什麼。 –

+0

它清楚你正在嘗試確定'id'是否在'list_id'中,但它不清楚你想要採取什麼行動 –

+0

我必須從list_id列創建一個新的colour列表list_x –

回答

3

使用列表理解:

df.loc[:,'list_x'] = [df.x[df['id'].isin(l)].values for l in df.list_id] 

完整的示例以虛擬數據:

import pandas as pd 

data= { 
    'id': [1,2,3,4], 
    'x': [20,10,10,30], 
    'list_id': [[2,4],[1,3],[1],[1,2]], 
} 

df = pd.DataFrame(data) 

df.loc[:,'list_x'] = [df.x[df['id'].isin(l)].values for l in df.list_id] 

輸出

print df 

    list_id x list_x 
1 [2, 4] 20 [10, 30] 
2 [1, 3] 10 [20, 10] 
3  [1] 10  [20] 
4 [1, 2] 30 [20, 10] 
+0

這個腳本完美地工作,謝謝 –

0

創造性的解決方案
使用numpy OB與set元素

i = np.array([set([x]) for x in df.id.values.tolist()]) 
x = np.empty(i.shape, dtype=object) 
x[:] = [[x] for x in df.x.values.tolist()] 
y = np.empty_like(x) 
y.fill([]) 
j = np.array([set(x) for x in df.list_id.values.tolist()]) 

df.assign(list_x=np.where(i <= j[:, None], x, y).sum(1)) 

    id x list_id list_x 
0 1 20 [2, 4] [10, 30] 
1 2 10 [1, 3] [20, 10] 
2 3 10  [1]  [20] 
3 4 30 [1, 2] [20, 10] 

定時

%timeit df.assign(list_x=[df.x[df['id'].isin(l)].values for l in df.list_id]) 

1000 loops, best of 3: 1.21 ms per loop 

%%timeit 
i = np.array([set([x]) for x in df.id.values.tolist()]) 
x = np.empty(i.shape, dtype=object) 
x[:] = [[x] for x in df.x.values.tolist()] 
y = np.empty_like(x) 
y.fill([]) 
j = np.array([set(x) for x in df.list_id.values.tolist()]) 

df.assign(list_x=np.where(i <= j[:, None], x, y).sum(1)) 

1000 loops, best of 3: 371 µs per loop