Dataframe.lookup和映射组合导致列标签错误

Roy*_*Han 2 python dataframe pandas

我有一个大约为(1200,10)的大型数据帧,大部分是字符串,我必须在现有引用列说'Y'的基础上附加一个新列说'Z',其值是'A','B','C或未知(NaN或其他),因此我需要在df中选择三个对应的列之一,例如“ D”,“ E”,“ F”,或输出NaN并将此值附加为列“ Z”。我目前有以下代码:

df = pd.DataFrame({'T': {0: '.', 1: '.', 2: '.', 3: '.'}, 
                   'G': {0: '.', 1: '.', 2: '.', 3: '.'}, 
                   'D': {0: 4, 1: 1, 2: 5, 3: 3}, 
                   'E': {0: 6, 1: 2, 2: 7, 3: 2}, 
                   'F': {0: 8, 1: 3, 2: 9, 3: 1}, 
                   'K': {0: '.', 1: '.', 2: '.', 3:'.'}, 
                   'Y': {0: 'A', 1: 'B', 2: 'B', 3: np.nan}})

d = {'A': 'D', 'B': 'E', 'C': 'F'}
df['Z'] = df.lookup(df.index, df.Y.map(d))
Run Code Online (Sandbox Code Playgroud)

问题在于,在Y为未知值的地方查找会失败。在特定的代码中,Y.unique()会出现类似(A,B,C,NaN,nan)的内容。所以我想知道是否有一种方法可以使用查找式方法将Z输出到NaN,其中Y是NaN或给定字典之外的未知数?


    T   G   D   E   F   K   Y   Z
0   .   .   4   6   8   .   A   4.0
1   .   .   1   2   3   .   B   2.0
2   .   .   5   7   9   .   B   7.0
3   .   .   3   2   1   .   NaN NaN
Run Code Online (Sandbox Code Playgroud)

Sco*_*ton 6

您可以将zip stackreindexzip用于多索引:

df['Z'] = df.stack().reindex(zip(df.index, df.Y.map(d))).reset_index(level=1, drop=True)
Run Code Online (Sandbox Code Playgroud)

输出:

   T  G  D  E  F  K    Y    Z
0  .  .  4  6  8  .    A    4
1  .  .  1  2  3  .    B    2
2  .  .  5  7  9  .    B    7
3  .  .  3  2  1  .  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

细节:

首先,让我们使用stack,将列标题移到数据框的行索引中,为数据框创建一个多索引。其中,级别0是原始行索引,级别1是列标题。

现在,我们可以reindex用来仅过滤所需的那些索引。使用元组标识多索引。(level0,level1)因此,我们zipdf.index和df.y.map(d)一起创建了reindex使用的元组。

最后,我们删除multiindex的level = 1,以创建原始索引的结构,并为这些列分配一个新值。