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

如果我有一个如下所示的数据框:


df = pd.DataFrame({'A': [1,1,1,2,2,2], 'B': [4,5,6,7,8,9]})

df['C'] = None


   A  B     C

0  1  4  None

1  1  5  None

2  1  6  None

3  2  7  None

4  2  8  None

5  2  9  None

如何将 的子集设置C为相同的字典值?例如,C为所有行设置A==1到哪里{'example': 5}?


这似乎不起作用:


df.loc[df['A']==1, 'C'] = {'example': 5}


浮云间
浏览 120回答 2
2回答

阿波罗的战车

np.where在这种情况下你可以使用:df['C'] = np.where(df['A']==1, {'example': 5}, df['C'])输出:   A  B               C0  1  4  {'example': 5}1  1  5  {'example': 5}2  1  6  {'example': 5}3  2  7             NaN4  2  8             NaN5  2  9             NaN由于更新{'example': 5}是一个可迭代的对象,当您将其分配给列时,Pandas 会尝试展开它,因此如果您直接这样做,则会出现长度不匹配错误。要将整个列分配给该字典,您需要将其包装在另一个具有相同长度的迭代中df:df['C'] = [{'example':5} for _ in df.index]输出:   A  B               C0  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'}

慕丝7291255

您可以使用np.where:df['C'] = np.where(df['A']==1, {'example': 5}, df['C'])print(df)印刷:   A  B               C0  1  4  {'example': 5}1  1  5  {'example': 5}2  1  6  {'example': 5}3  2  7            None4  2  8            None5  2  9            None
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python