首页 > 解决方案 > 根据其他行和列更改单元格值

问题描述

我有一个Result来自 SQL 查询的数据框:

Loc  ID   Bank
1    23   NULL
1    24   NULL
1    25   NULL
2    23   6
2    24   7
2    25   8

我试图将Loc == 1BankLoc == 2的值设置为相同时的 Bank ID,结果是:

Loc  ID   Bank
1    23   6
1    24   7
1    25   8
2    23   6
2    24   7
2    25   8

这是我使用代码的地方,我知道结局非常简单,我只是无法围绕不涉及迭代每一行(9000〜)的解决方案。

result.loc[(result['Loc'] == '1'), 'bank'] = ???

标签: pythonpandasdataframe

解决方案


为什么不使用pandas.MultiIndex

共同点

# Arguments,
_0th_level = 'Loc'
merge_key  = 'ID'
value_key  = 'Bank'  # or a list of colnames or `slice(None)` to propagate all columns values.
src_key    = '2'
dst_key    = '1'
# Computed once for all,
df         = result.set_index([_0th_level, merge_key])
df2        = df.xs(key=src_key, level=_0th_level, drop_level=False)
df1_       = df2.rename(level=_0th_level, index={src_key: dst_key})

第一种(天真的)方法

df.loc[df1_.index, value_key] = df1_
# to get `result` back : df.reset_index()

第二种(稳健)方法

如图所示,如果缺少一个或多个标签 [...] ,第一种方法可能是非法的(自 pandas 版本 1.0.0 起)。

因此,如果您必须确保在源和目标都存在索引,则以下内容仅在 shared 上执行ID

df1 = df.xs(key=dst_key, level=_0th_level, drop_level=False)
idx = df1.index.intersection(df1_.index)  # <-----
df.loc[idx, value_key] = df1_.loc[idx, value_key]

推荐阅读