样本数据:
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
答案 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