【问题标题】:Updating a DataFrame based on another DataFrame基于另一个 DataFrame 更新一个 DataFrame
【发布时间】: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

如果匹配,我想匹配 IdSexGroup 并使用 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)
  • 好的,安迪,首先你打败了我的答案,现在我的评论:)

标签: python pandas dataframe


【解决方案1】:

我想我会通过合并来做到这一点,然后用 where 更新列。首先从 up 中移除 Time 列:

In [11]: times = up.pop('Time')  # up = the update DataFrame

In [12]: df1 = df.merge(up, how='outer')

In [13]: df1
Out[13]:
   Id Sex  Group  Time  Time!
0  21   M      2  2.31    NaN
1   2   F      2  2.29    NaN
2   3   F      1   NaN    NaN

如果不是 NaN 和 Time,则更新时间!如果是 NaN:

In [14]: df1['Time!'] = df1['Time'].where(df1['Time'].isnull(), times)

In [15]: df1['Time'] = df1['Time'].where(df1['Time'].notnull(), times)

In [16]: df1
Out[16]:
   Id Sex  Group  Time  Time!
0  21   M      2  2.31   2.36
1   2   F      2  2.29   2.09
2   3   F      1  1.79    NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2020-11-30
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    相关资源
    最近更新 更多