![](/img/trans.png)
[英]Subtract the value in a field in one row from all other rows of the same field in pandas dataframe
[英]Change field in row if other row has same value in different field
我正在寻找基于 Python 的解决方案来解决我经常遇到的常见任务。 (我知道,这一定有很酷的 SQL 魔法,但是……现在不行。)
给定一个表,如果oid
相同,我们想更改字段f2
。
(假设f2
始终包含bar
或如果oid
为42
则为空):
ID | f1 | f2 | oid |
---|---|---|---|
1个 | 富 | 酒吧 | 42 |
2个 | 富 | 49 | |
3个 | 巴兹 | 42 |
变成:
ID | f1 | f2 | oid |
---|---|---|---|
1个 | 富 | 酒吧 | 42 |
2个 | 富 | 49 | |
3个 | 巴兹 | 酒吧 | 42 |
我目前正在使用itertools.combinations
来避免重复比较,这似乎比双for
循环更有效。 但是对于非常大的数据集,它仍然变得不方便……考虑到 Big-O-Notation。
通过pandas或者numpy可以更优雅的解决问题吗?
假设 f2 始终包含 bar 或者如果 oid 为 42 则为空
也许我们也可以first
使用groupby
+ transform :
df['f2'] = df.replace('', np.nan).groupby('oid')['f2'].transform('first').fillna('')
Output:
id f1 f2 oid
0 1 foo bar 42
1 2 foo 49
2 3 baz bar 42
我能想到的唯一解决方案是使用groupby
+ ffill
:
df['f2'] = df.replace('', np.nan).groupby('oid')['f2'].ffill()
Output:
>>> df
id f1 f2 oid
0 1 foo bar 42
1 2 foo NaN 49
2 3 baz bar 42
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.