为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

SMILET 2022-01-18 17:17:25
我有一个大约 (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   Z0   .   .   4   6   8   .   A   4.01   .   .   1   2   3   .   B   2.02   .   .   5   7   9   .   B   7.03   .   .   3   2   1   .   NaN NaN
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

您可以将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    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

细节:


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


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


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


查看完整回答
反对 回复 2022-01-18
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我在用 .values


df['Z'] = df.values[df.index, df.columns.get_indexer_for(df.Y.map(d))]

df

Out[135]: 

   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


查看完整回答
反对 回复 2022-01-18
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

您可以用列中不存在的一些辅助值替换缺失值,并通过匹配这些值Y添加具有相同名称的新辅助列:DataFrame.assign


df['Z'] = df.assign(tmp = np.nan).lookup(df.index, df.Y.map(d).fillna('tmp'))

print (df)

   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

另一种解决方案:


df[np.nan] = np.nan

df['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    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


查看完整回答
反对 回复 2022-01-18
  • 3 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信