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:如何根据列的值聚合行的子集