使用列表根据多列中的值有条件地填充新列

时间:2016-10-18 01:52:59

标签: python list python-2.7 pandas

我正在尝试使用多个列中的值填充pandas数据框中的新列。原始列可以是0或' 1'每个系列只有一个1。通过填充{{1},新列将对应于df [' A'' B'' C'' D'] } 如下所示。 (new_col = [1, 3, 7, 10]上的1表示A;如果new_col = 1B=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 maploc,但似乎无法制定完成任务的有效方法。问题似乎非常接近to this。我还查看了其他一些帖子1 2 3。这些都没有显示如何有条件地使用多个列来填充基于列表的新列。

2 个答案:

答案 0 :(得分:2)

我可以想到一些方法,主要是涉及argmaxidxmax,以获得一个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