Pandas 数据框根据元组列表创建新列
Pandas dataframe create new column based on list of tuples
考虑这个数据框:
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
那么,将值复制到新数据框列的最佳方法是什么?
不确定这是否更好,但您可以将元组放入字典中并使用 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])
您可以使用全Pandas方法;将元组转换为数据框并将其与原始数据合并:
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
#....
考虑这个数据框:
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
那么,将值复制到新数据框列的最佳方法是什么?
不确定这是否更好,但您可以将元组放入字典中并使用 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])
您可以使用全Pandas方法;将元组转换为数据框并将其与原始数据合并:
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
#....