使用pandas检查值是否存在或是否为new

时间:2017-07-31 09:47:27

标签: python pandas

我有2个名单。

A = [1,2,3,5,8]

B = [2,3,4,5,6,7]

我想创建一个pandas df,以便:

如果值仅存在于A中,则在df中为该值追加状态A,类似于B,如果A和B都存在值,则在df中追加A,B。例如:

values    status

1          A
2          A,B
3          A,B
4          B
5          A,B 
6          B
7          B
8          A

4 个答案:

答案 0 :(得分:3)

你可以使用一种简单的方法和apply来做一些

def find(x):
    if x in A and x in B:
        return 'A,B'
    elif x in A:
        return 'A'
    elif x in B:
        return 'B'     
    else: 
        return None
A = [1,2,3,5,8]
B = [2,3,4,5,6,7]
df = pd.DataFrame({'values':[1,2,3,4,5,6,7,8,9,10]})
df['status'] = df['values'].apply(find)

输出:

 values status
0  1    A
1  2  A,B
2  3  A,B
3  4    B
4  5  A,B
5  6    B
6  7    B
7  8    A
8  9  None
9  10 None

答案 1 :(得分:2)

您可以在列表的字典中使用applylambda

In [568]: df['values'].apply(
              lambda x: ','.join([k for k, L in {'A': A, 'B': B}.items() if x in L]))
Out[568]:
0      A
1    A,B
2    A,B
3      B
4    A,B
5      B
6      B
7      A
Name: values, dtype: object

In [570]: df['Status'] = df['values'].apply(
                lambda x: ','.join([k for k, L in {'A': A, 'B': B}.items() if x in L]))

In [571]: df
Out[571]:
   values Status
0       1      A
1       2    A,B
2       3    A,B
3       4      B
4       5    A,B
5       6      B
6       7      B
7       8      A

答案 2 :(得分:2)

我这样做:

助手查找系列:

In [80]: lkp = pd.Series('A', index=A).append(pd.Series('B', index=B)) \
                 .groupby(level=0).apply(','.join)

In [83]: lkp
Out[83]:
1      A
2    A,B
3    A,B
4      B
5    A,B
6      B
7      B
8      A
dtype: object

映射:

In [81]: df['status'] = df['values'].map(lkp)

In [82]: df
Out[82]:
   values status
0       1      A
1       2    A,B
2       3    A,B
3       4      B
4       5    A,B
5       6      B
6       7      B
7       8      A

答案 3 :(得分:0)

尝试这样的事情,

A = [1,2,3,5,8]
B = [2,3,4,5,6,7]

def map_values(i):
    return 'A,B' if i in A and i in B else 'A' if i in A else 'B' if i in B else None 

df['values'] = list(set(A+B))
df['status'] =  df['values'].apply(map_values)

结果:

In [8]: df
Out[8]: 
   values status
0       1      A
1       2    A,B
2       3    A,B
3       4      B
4       5    A,B
5       6      B
6       7      B
7       8      A