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

Posted

技术标签:

【中文标题】Pandas 将列的子集设置为相同的 dict 值【英文标题】:Pandas set subset of column to the same dict value 【发布时间】:2021-01-18 11:14:09 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

在这种情况下,您可以使用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 数据框中的复杂对象。


Update 2:根据 BEN 的评论,也反映在 Update

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'不同副本

【讨论】:

谢谢!我认为您是第一个,但我实际上无法确定:) 另外,如果您不介意,如何将 C 的整个列设置为该 dict 值?一旦允许就会接受这个答案 2nd 1 更安全【参考方案2】:

你可以使用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

【讨论】:

不安全~

以上是关于Pandas 将列的子集设置为相同的 dict 值的主要内容,如果未能解决你的问题,请参考以下文章

将列的名称保留在 groupby 中,并在 pandas 数据框中使用 sum

pandas dataframe:如何根据列的值聚合行的子集

Pandas: Grouped DataFrame - 将列的值除以每个组该列中某一行的值

使用索引设置 Pandas 列的字符串值

如何将列的默认值设置为今天的日期? [复制]

我可以将列的默认值设置为同一表中同一行上另一列的字符串吗?