【发布时间】:2014-04-24 21:55:34
【问题描述】:
我正在使用 Pandas Python 库来比较两个数据帧,每个数据帧由一列日期和两列值组成。其中一个数据框,称为LongDF,包含比另一个更多的日期,称为ShortDF。两个数据框都使用pandas.tseries.index.DatetimeIndex按日期编入索引,见下文(为了演示,我将两者都缩短了)。
LongDF
╔════════════╦════════╦════════╗
║ Date ║ Value1 ║ Value2 ║
╠════════════╬════════╬════════╣
║ 1990-03-17 ║ 6.84 ║ 1.77 ║
║ 1990-03-18 ║ 0.99 ║ 7.00 ║
║ 1990-03-19 ║ 4.90 ║ 8.48 ║
║ 1990-03-20 ║ 2.57 ║ 2.41 ║
║ 1990-03-21 ║ 4.10 ║ 8.33 ║
║ 1990-03-22 ║ 8.86 ║ 1.31 ║
║ 1990-03-23 ║ 6.01 ║ 6.22 ║
║ 1990-03-24 ║ 0.74 ║ 1.69 ║
║ 1990-03-25 ║ 5.56 ║ 7.30 ║
║ 1990-03-26 ║ 8.05 ║ 1.67 ║
║ 1990-03-27 ║ 8.87 ║ 8.22 ║
║ 1990-03-28 ║ 9.00 ║ 6.83 ║
║ 1990-03-29 ║ 1.34 ║ 6.00 ║
║ 1990-03-30 ║ 1.69 ║ 0.40 ║
║ 1990-03-31 ║ 8.71 ║ 3.26 ║
║ 1990-04-01 ║ 4.05 ║ 4.53 ║
║ 1990-04-02 ║ 9.75 ║ 4.79 ║
║ 1990-04-03 ║ 7.74 ║ 0.44 ║
╚════════════╩════════╩════════╝
ShrotDF
╔════════════╦════════╦════════╗
║ Date ║ Value1 ║ Value2 ║
╠════════════╬════════╬════════╣
║ 1990-03-25 ║ 1.98 ║ 3.92 ║
║ 1990-03-26 ║ 3.37 ║ 3.40 ║
║ 1990-03-27 ║ 2.93 ║ 7.93 ║
║ 1990-03-28 ║ 2.35 ║ 5.34 ║
║ 1990-03-29 ║ 1.41 ║ 7.62 ║
║ 1990-03-30 ║ 9.85 ║ 3.17 ║
║ 1990-03-31 ║ 9.95 ║ 0.35 ║
║ 1990-04-01 ║ 4.42 ║ 7.11 ║
║ 1990-04-02 ║ 1.33 ║ 6.47 ║
║ 1990-04-03 ║ 6.63 ║ 1.78 ║
╚════════════╩════════╩════════╝
我想做的是参考每个数据集中同一天发生的数据,将两个集合中的数据放入一个公式中,如果更大比某个数字,将日期和值粘贴到另一个数据框中。
我假设我应该使用类似for row in ShortDF.iterrows(): 的东西来遍历ShortDF 上的每个日期,但我不知道如何使用DatetimeIndex 来选择LongDF 上的相应行。
任何帮助将不胜感激
【问题讨论】:
-
您是仅在同一个 df 中比较每个 df 中的每一行,还是在两个 df 中比较相同日期?如果是这样,您是否只查看两者中都存在的日期?
-
@EdChum 感谢您的回复,我可能应该在上面说得更清楚一点。我在 dfs 之间进行比较。在这种情况下,我碰巧知道 ShortDF 中的所有日期都存在于 LongDF 中,但总的来说,我只对查看两个集合中都存在的日期感兴趣。
-
在这种情况下合并它们,然后根据您的函数的复杂性使用 lambda 或定义您的函数并按行应用它,所以
merged = df.merge(df1, on='Date')然后merged.apply(myfunc, axis=1)或merged.apply(lambda row: myfunc(row), axis=1)我在决定最好的方法之前,需要先看看你的功能,而且这里已经很晚了,所以我可能不会回答 -
实际上我要做的是合并,然后对合并的 df 执行布尔屏蔽:
merged[merged[['Value1','Value2']].max(axis=1) > my_val]这将返回高于阈值的每一行的最高值。执行合并时,您可能会得到重复的列,其中两个 dfs 中的 Value1 不匹配,默认情况下它们将具有后缀_x和_y,您可以重命名或不关心看到,因为您只想要最高值 -
@EdChum 感谢您的回复。我试了一下,得到了一大串错误。让我看看我是否理解正确:我想在使用任何函数之前合并两个数据帧,对吗?我会使用
merged=ShortDF.merge(LongDF, on='Date')来做到这一点。我理解正确吗?
标签: python pandas indexing dataframe