我想使用Pandas方法链接的现代方法将值分配给列的子集.
假设我有以下数据框
df = pd.DataFrame({'a': [1, 0, 0, 1]})
a
0 1
1 0
2 0
3 1
我想达到相当于
df.loc[df.a == 1, 'a'] = 2
用类似的东西
df.query('a == 1').assign(a=2)
但是,以上内容创建了一个子集数据框,并且没有修改整个数据框.这有可能实现吗?
解决方法:
顾名思义,查询方法用于查询数据框,而不用于设置值.
因此,loc完全合适,请注意您可以通过字符串将其分配给系列:
df.loc[df.a == 1, 'a'] = 2
比较习惯的做法可能是使用pd.Series.mask
,您甚至可以就地使用它:
df['a'].mask(df['a'] == 1, 2, inplace=True)
您应该将“方法链接”视为达到目的的一种手段,而不是其本身的要求或目标.如果设置使用方法链接,则可以使用pd.DataFrame.assign
:
df = df.assign(a=df['a'].mask(df['a'] == 1, 2))
作为一个独立的操作,我发现这不太可读.但是您可能会发现它对于通过方法链进行的多个链接操作很有用.