我有一个df_trg
,其中有10行编号为0-9
。
我从各种来源获得了附加列foo
的值,该列仅包含行的子集,例如S1
有0-3, 7, 9
,而S2
有4, 6
。
我想用一个新列foo
获得一个数据帧,其中某些行可能会保留NaN
。
除了以下方式之外,还有“更精细”的方式吗?
df_trg['foo'] = np.nan
for src in sources:
df_trg['foo'][df_trg.index.isin(src.index)] = src
例如使用
join
或merge
?
答案 0 :(得分:0)
让我们使用以下命令创建源DataFrame( df ), s1 和 s2 ( Series 对象) 更新数据)以及它们的列表(来源):
df = pd.DataFrame(np.arange(1, 51).reshape((5, -1)).T)
s1 = pd.Series([11, 12, 13, 14, 15, 16], index=[0, 1, 2, 3, 7, 9])
s2 = pd.Series([27, 28], index=[4, 6])
sources = [s1, s2]
从添加 foo 列开始计算,该列最初填充 一个空字符串:
df = df.assign(foo='')
然后运行以下“更新”循环:
for src in sources:
df.foo.update(other=src)
结果是:
0 1 2 3 4 foo
0 1 11 21 31 41 11
1 2 12 22 32 42 12
2 3 13 23 33 43 13
3 4 14 24 34 44 14
4 5 15 25 35 45 27
5 6 16 26 36 46
6 7 17 27 37 47 28
7 8 18 28 38 48 15
8 9 19 29 39 49
9 10 20 30 40 50 16
我认为,此解决方案比您的解决方案好(至少一点),并且 较短。
替代方法:最初用 NaN 填充 foo 列,但这一次 更新值将转换为 float (使用 NaN 的副作用)。