我正在尝试使用多个列中的值填充pandas数据框中的新列。原始列可以是0
或' 1'每个系列只有一个1
。通过填充{{1},新列将对应于df [' A'' B'' C'' D'] } 如下所示。 (new_col = [1, 3, 7, 10]
上的1
表示A
;如果new_col = 1
,B=1
等,则
new_col = 3
新df
A B C D
1 1 0 0 0
2 0 0 1 0
3 0 0 0 1
4 0 1 0 0
应如下所示。
df
我尝试使用df
A B C D new_col
1 1 0 0 0 1
2 0 0 1 0 7
3 0 0 0 1 10
4 0 1 0 0 3
,map
和loc
,但似乎无法制定完成任务的有效方法。问题似乎非常接近to this。我还查看了其他一些帖子1 2 3。这些都没有显示如何有条件地使用多个列来填充基于列表的新列。
答案 0 :(得分:2)
我可以想到一些方法,主要是涉及argmax
或idxmax
,以获得一个ndarray或一个我们可以用来填充列的系列。
我们可以下拉到numpy
,找到最大位置(1的位置)并使用它们索引到new_col的数组版本:
In [148]: np.take(new_col,np.argmax(df.values,1))
Out[148]: array([ 1, 7, 10, 3])
我们可以使用new_col作为值,将列作为索引,并使用idxmax编制索引:
In [116]: pd.Series(new_col, index=df.columns).loc[df.idxmax(1)].values
Out[116]: array([ 1, 7, 10, 3])
我们可以使用get_indexer将列idxmax结果转换为我们可以与new_col一起使用的整数偏移量:
In [117]: np.array(new_col)[df.columns.get_indexer(df.idxmax(axis=1))]
Out[117]: array([ 1, 7, 10, 3])
或者(这看起来非常浪费)我们可以使用新列创建一个新框架并直接使用idxmax:
In [118]: pd.DataFrame(df.values, columns=new_col).idxmax(1)
Out[118]:
0 1
1 7
2 10
3 3
dtype: int64
答案 1 :(得分:0)
它不是最优雅的解决方案,但对我来说它胜过if / elif / elif循环:
d = {'A': 1, 'B': 3, 'C': 7, 'D': 10}
def new_col(row):
k = row[row == 1].index.tolist()[0]
return d[k]
df['new_col'] = df.apply(new_col, axis=1)
输出:
A B C D new_col
1 1 0 0 0 1
2 0 0 1 0 7
3 0 0 0 1 10
4 0 1 0 0 3