考虑这个数据框:
In [0]: df = pd.DataFrame({'Num': [1, 2, 3, 4] * 5})
In [1]: len(df)
Out[1]: 20
我想基于元组列表创建一个新列:例如:
In [2]: tup = [(1, 0), (2, 1), (3, 0), (4, 1)]
In [3]: len(tup)
Out[3]: 4
对于元组中第一项的df['Num'] ==
,我想将第二个值添加到新列。
这是所需输出的示例:
Num bin
0 1 0
1 2 1
2 3 0
3 4 1
4 1 0
5 2 1
6 3 0
...
19 4 1
我尝试使用此代码来实现此结果:
df['bin'] = [j for l in df['Num'] for i,j in tup if i == l]
结果还可以,但我收到了警告:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
那么,将值复制到新数据框列的最佳方法是什么?
答案 0 :(得分:3)
你可以使用全熊猫的方法;将您的元组转换为数据帧并将其与原始数据合并:
tuples_as_df = pd.DataFrame(tup, columns=['dummy','bin'])
df = df.merge(tuples_as_df, how='left', left_on='Num', right_on='dummy')
del df['dummy'] # The merge key, not needed anymore
# Num bin
#0 1 0
#1 2 1
#2 3 0
#3 4 1
#4 1 0
#5 2 1
#....
答案 1 :(得分:0)
不确定这是否更好,但您可以将元组放入字典并使用applymap
:
tup = [(1, 0), (2, 1), (3, 0), (4, 1)]
d = {k:v for k,v in tup}
df['bin'] = df.applymap(lambda x: d[x])