【发布时间】:2014-02-25 22:22:34
【问题描述】:
给定 DataFrame df:
Id Sex Group Time Time!
0 21 M 2 2.31 NaN
1 2 F 2 2.29 NaN
和update:
Id Sex Group Time
0 21 M 2 2.36
1 2 F 2 2.09
2 3 F 1 1.79
如果匹配,我想匹配 Id、Sex 和 Group 并使用 Time 值(来自 update df)更新 Time!,如果匹配,则插入新记录。
这是我的做法:
df = df.set_index(['Id', 'Sex', 'Group'])
update = update.set_index(['Id', 'Sex', 'Group'])
for i, row in update.iterrows():
if i in df.index: # update
df.ix[i, 'Time!'] = row['Time']
else: # insert new record
cols = up.columns.values
row = np.array(row).reshape(1, len(row))
_ = pd.DataFrame(row, index=[i], columns=cols)
df = df.append(_)
print df
Time Time!
Id Sex Group
21 M 2 2.31 2.36
2 F 2 2.29 2.09
3 F 1 1.79 NaN
代码似乎有效,我希望的结果与上述匹配。但是,我注意到这在大数据集上表现不佳,有条件
if i in df.index:
...
else:
...
工作显然是错误的(它会进入else,反之亦然,我猜,这个 MultiIndex 可能是某种原因)。
所以我的问题是,您知道基于另一个 df 更新一个 df 的任何其他方式,或者我的更强大的版本吗?
【问题讨论】:
-
我认为您的预期有误,2.09 行,更新中没有 group=1。
-
我认为您的预期输出有错字。您提供的示例中没有
(2, F, 1) -
好的,安迪,首先你打败了我的答案,现在我的评论:)