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

Pandas 将列的子集设置为相同的字典值

Pandas 将列的子集设置为相同的字典值

浮云间 2023-10-05 16:43:45
如果我有一个如下所示的数据框:df = pd.DataFrame({'A': [1,1,1,2,2,2], 'B': [4,5,6,7,8,9]})df['C'] = None   A  B     C0  1  4  None1  1  5  None2  1  6  None3  2  7  None4  2  8  None5  2  9  None如何将 的子集设置C为相同的字典值?例如,C为所有行设置A==1到哪里{'example': 5}?这似乎不起作用:df.loc[df['A']==1, 'C'] = {'example': 5}
查看完整描述

2 回答

?
阿波罗的战车

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

np.where在这种情况下你可以使用:


df['C'] = np.where(df['A']==1, {'example': 5}, df['C'])

输出:


   A  B               C

0  1  4  {'example': 5}

1  1  5  {'example': 5}

2  1  6  {'example': 5}

3  2  7             NaN

4  2  8             NaN

5  2  9             NaN

由于更新{'example': 5}是一个可迭代的对象,当您将其分配给列时,Pandas 会尝试展开它,因此如果您直接这样做,则会出现长度不匹配错误。要将整个列分配给该字典,您需要将其包装在另一个具有相同长度的迭代中df:


df['C'] = [{'example':5} for _ in df.index]

输出:


   A  B               C

0  1  4  {'example': 5}

1  1  5  {'example': 5}

2  1  6  {'example': 5}

3  2  7  {'example': 5}

4  2  8  {'example': 5}

5  2  9  {'example': 5}

也就是说,除非确实有必要,否则应尽可能避免 Pandas 数据框中的复杂对象。


更新 2:根据 BEN 的评论,也反映在更新中


df['C'] = np.where(df['A']==1, {'example': 5}, df['C'])

可能会将同一对象复制{'example':5}到所有有效行,这可能不是预期的行为。所以对于这样的事情:


df['C'] = [{'example':5} if a==1 else c for a,c in zip(df['A'], df['C'])]

将为各个行创建不同的副本。{'example':5'}


查看完整回答
反对 回复 2023-10-05
?
慕丝7291255

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

您可以使用np.where:


df['C'] = np.where(df['A']==1, {'example': 5}, df['C'])

print(df)

印刷:


   A  B               C

0  1  4  {'example': 5}

1  1  5  {'example': 5}

2  1  6  {'example': 5}

3  2  7            None

4  2  8            None

5  2  9            None


查看完整回答
反对 回复 2023-10-05
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

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