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

我有一个大约 (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))

问题是查找会在 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


SMILET
浏览 153回答 3
3回答

隔江千里

您可以将stackandreindex与 zip 一起用于多索引:df['Z'] = df.stack().reindex(zip(df.index, df.Y.map(d))).reset_index(level=1, drop=True)输出:   T  G  D  E  F  K    Y    Z0  .  .  4  6  8  .    A    41  .  .  1  2  3  .    B    22  .  .  5  7  9  .    B    73  .  .  3  2  1  .  NaN  NaN细节:首先,让我们使用stack,将列标题移动到数据框行索引中,为数据框创建一个多索引。其中,级别 0 是原始行索引,级别 1 是列标题。现在,我们可以使用它reindex来过滤到我们需要的那些索引。使用元组标识多索引。(level0, level1) 因此,我们zipdf.index 和 df.y.map(d) 一起创建了 reindex 使用的元组。最后,我们删除多索引的 level=1,创建原始索引的结构,并用这些值分配一个新列。

慕丝7291255

我在用 .valuesdf['Z'] = df.values[df.index, df.columns.get_indexer_for(df.Y.map(d))]dfOut[135]:    T  G  D  E  F  K    Y    Z0  .  .  4  6  8  .    A    41  .  .  1  2  3  .    B    22  .  .  5  7  9  .    B    73  .  .  3  2  1  .  NaN  NaN

有只小跳蛙

您可以用列中不存在的一些辅助值替换缺失值,并通过匹配这些值Y添加具有相同名称的新辅助列:DataFrame.assigndf['Z'] = df.assign(tmp = np.nan).lookup(df.index, df.Y.map(d).fillna('tmp'))print (df)   T  G  D  E  F  K    Y    Z0  .  .  4  6  8  .    A  4.01  .  .  1  2  3  .    B  2.02  .  .  5  7  9  .    B  7.03  .  .  3  2  1  .  NaN  NaN另一种解决方案:df[np.nan] = np.nandf['Z'] = df.lookup(df.index, df.Y.map(d))df = df.drop(np.nan, axis=1)print (df)   T  G  D  E  F  K    Y    Z0  .  .  4  6  8  .    A  4.01  .  .  1  2  3  .    B  2.02  .  .  5  7  9  .    B  7.03  .  .  3  2  1  .  NaN  NaN
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python