我有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
答案 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)
您可以在列表的字典中使用apply
和lambda
。
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