Pandas数据框基于元组列表创建新列

时间:2017-04-29 00:43:58

标签: python pandas dataframe python-3.4

考虑这个数据框:

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

那么,将值复制到新数据框列的最佳方法是什么?

2 个答案:

答案 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])