用其中一列中的值索引熊猫数据框

时间:2019-03-11 20:03:05

标签: pandas dataframe

样本数据:

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randn(10, 3), columns=['A', 'B', 'C'])
df['idx'] = ['A', 'B', 'C', 'D', 'A', 'B', 'C', 'B', 'C', 'D']
print(df)

          A         B         C idx
0  1.764052  0.400157  0.978738   A
1  2.240893  1.867558 -0.977278   B
2  0.950088 -0.151357 -0.103219   C
3  0.410599  0.144044  1.454274   D
4  0.761038  0.121675  0.443863   A
5  0.333674  1.494079 -0.205158   B
6  0.313068 -0.854096 -2.552990   C
7  0.653619  0.864436 -0.742165   B
8  2.269755 -1.454366  0.045759   C
9 -0.187184  1.532779  1.469359   D

我有一个像上面的熊猫数据框。

我需要为每行创建一个新列'value',如果该列存在'idx',则为该列索引,如果不存在则返回'NaN'。

我的预期输出是:

          A         B         C idx     value
0  1.764052  0.400157  0.978738   A  1.764052
1  2.240893  1.867558 -0.977278   B  1.867558
2  0.950088 -0.151357 -0.103219   C -0.103219
3  0.410599  0.144044  1.454274   D  NaN
4  0.761038  0.121675  0.443863   A  0.761038
5  0.333674  1.494079 -0.205158   B  1.494079
6  0.313068 -0.854096 -2.552990   C -2.552990
7  0.653619  0.864436 -0.742165   B  0.864436
8  2.269755 -1.454366  0.045759   C  0.045759
9 -0.187184  1.532779  1.469359   D  NaN

2 个答案:

答案 0 :(得分:3)

使用isin过滤掉无效的列名,然后使用DataFrame.lookup来“查找”您的值。

idx = df.loc[df.idx.isin(df.columns), 'idx']
df.loc[idx.index, 'value'] = df.lookup(idx.index, idx)
df

          A         B         C idx     value
0  1.764052  0.400157  0.978738   A  1.764052
1  2.240893  1.867558 -0.977278   B  1.867558
2  0.950088 -0.151357 -0.103219   C -0.103219
3  0.410599  0.144044  1.454274   D       NaN
4  0.761038  0.121675  0.443863   A  0.761038
5  0.333674  1.494079 -0.205158   B  1.494079
6  0.313068 -0.854096 -2.552990   C -2.552990
7  0.653619  0.864436 -0.742165   B  0.864436
8  2.269755 -1.454366  0.045759   C  0.045759
9 -0.187184  1.532779  1.469359   D       NaN

答案 1 :(得分:3)

使用

df['value']=np.nan

df['value']=df.values[df.index,df.columns.get_indexer(df.idx)]
df
Out[1130]: 
          A         B         C idx     value
0  0.416356 -1.290687 -0.436484   A  0.416356
1  0.600539  1.107413 -0.100904   B   1.10741
2 -0.455892  0.913249  0.294055   C  0.294055
3 -0.545505 -1.120002 -1.649593   D       NaN
4 -0.710129 -1.563575 -0.343713   A -0.710129
5 -0.684759 -0.554275 -0.400649   B -0.554275
6  0.148388 -0.088781  0.445293   C  0.445293
7  0.974738 -0.444588  0.290779   B -0.444588
8  2.346131  0.084158 -0.855563   C -0.855563
9  0.812868 -1.308031  0.605916   D       NaN