Pandas - 使用其他列值作为列名选择列

时间:2017-08-03 14:35:38

标签: python pandas

我有一个包含列的数据框,我们称之为“名称”。 “names”具有其他列的名称。我想添加一个新列,根据“names”列中包含的列名,为每行提供值。

示例:

输入数据框: pd.DataFrame.from_dict({"a": [1, 2, 3,4], "b": [-1,-2,-3,-4], "names":['a','b','a','b']})

  a  |  b  | names |
 --- | --- | ----  |
  1  |  -1 | 'a'   |
  2  |  -2 | 'b'   |
  3  |  -3 | 'a'   |
  4  |  -4 | 'b'   |

输出数据帧: pd.DataFrame.from_dict({"a": [1, 2, 3,4], "b": [-1,-2,-3,-4], "names":['a','b','a','b'], "new_col":[1,-2,3,-4]})

  a  |  b  | names | new_col | 
 --- | --- | ----  | ------  |
  1  |  -1 | 'a'   |    1    |
  2  |  -2 | 'b'   |   -2    |
  3  |  -3 | 'a'   |    3    |
  4  |  -4 | 'b'   |   -4    |

谢谢

3 个答案:

答案 0 :(得分:7)

您可以使用lookup

df['new_col'] = df.lookup(df.index, df.names)
df
#   a    b  names   new_col
#0  1   -1      a   1
#1  2   -2      b   -2
#2  3   -3      a   3
#3  4   -4      b   -4

答案 1 :(得分:2)

因为从 Pandas 1.2.0 开始不推荐使用 DataFrame.lookup,以下是我使用 DataFrame.melt 提出的:

df['new_col'] = df.melt(id_vars='names', value_vars=['a', 'b'], ignore_index=False).query('names == variable').loc[df.index, 'value']

输出:

>>> df
   a  b names  new_col
0  1 -1     a        1
1  2 -2     b       -2
2  3 -3     a        3
3  4 -4     b       -4

这可以简化吗?为正确起见,不得忽略索引。

补充参考:

答案 2 :(得分:1)

使用 pd.factorize 的解决方案(来自 https://github.com/pandas-dev/pandas/issues/39171#issuecomment-773477244):

idx, cols = pd.factorize(df['names'])
df.reindex(cols, axis=1).to_numpy()[np.arange(len(df)), idx]