【问题标题】:Slicing dfs in pandas在熊猫中切片dfs
【发布时间】:2018-05-14 17:23:03
【问题描述】:

我有一个包含日期的列表。看起来是这样的:

    [datetime.date(1994, 2, 4),
     datetime.date(1994, 3, 22),
     datetime.date(1994, 4, 18),
     datetime.date(1994, 5, 17),
     datetime.date(1994, 8, 16)
     ...]

和看起来像这样的熊猫df:

    Date    USD_I
0   1971-01-04  100.0000
1   1971-01-05  99.9700
2   1971-01-06  99.9500
3   1971-01-07  99.9400
4   1971-01-08  99.9300
5   1971-01-11  99.9100
6   1971-01-12  99.8900
7   1971-01-13  99.9000
8   1971-01-14  99.8300

and so on

我正在尝试构建一个新的 df,它应该如下所示:

     1994-02-04 1994-03-22 1994-04-18 ...
-2
-1
 0
 1
 2

“0”行中“1994-02-04”列的值应该是该日期从第一个 df 开始的值(“USD_I”列)。 “-1”行的值应该是前一天的值,“1”行的值应该是第二天的值,依此类推。简单地说,列是列表中的值,新 df 的值是来自第一个 df 的数据切片。

我正在尝试第二天这样做,但我仍然遇到索引错误并且无法在线找到解决方案。我将非常感谢任何帮助并提示如何处理它。


我正在尝试使用('result' 是最终 df 的名称):

for i in list:
    result[i] = df[df['Date']==i]['USD_I']

这给了我一个以日期作为列名的数据框,这很好,但第一行只有第一个日期的值,其他的是 NaN,所以我删除了整行并尝试:

for i in result:
    for x in range(-2,3):
        result.loc[x,i] = df.loc[(df[df['Date']==i].index.values+x),'USD_I']

但这给了我ValueError: Incompatible indexer with Series。

【问题讨论】:

  • 您遇到什么错误?您是否使用datetime.timedelta 来增加/减少天数?
  • 在您的输出数据框中,值应该是什么?它看起来只有一个索引和列
  • @Marmaduke 我在帖子中添加了更多详细信息以及我尝试这样做的方式。
  • @MattR “0”行中“1994-02-04”列的值应该是该日期从第一个 df(“USD_I”列)开始的值。 “-1”行的值应该是前一天的值,“1”行的值应该是第二天的值,依此类推。简单地说,列是列表中的值,新 df 的值是来自第一个 df 的数据切片。

标签: python pandas indexing slice


【解决方案1】:

我建议您研究一下 pandas pivot 方法 (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.pivot.html#pandas.DataFrame.pivot)。这将允许您将日期设为列名。从那里您可以使用 pd.timedelta (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Timedelta.html) 获取前一天的日期时间或发布当前日期。然后,您可以使用这个新的 datetime 对象重新索引数据框以获得正确的日期。

我相信使用 shift 方法可能有一种更简单的方法来做到这一点,但这假设你每天都有价值并且它们是有序的。

【讨论】:

  • 无论我使用天数还是索引值,我在最后一个循环的某个地方都犯了错误。我将循环的最后一行更改为 result.loc[x,i] = df[df['Date']== (i + dt.timedelta(days=x))]['USD_I'] 但它给了我 ValueError : 与 Series 不兼容的索引器。你知道我在做什么错吗?我完全迷失了。
【解决方案2】:

好的,完成了。我做了一个索引号列表,然后它就顺利进行了。我之前尝试过,但我的错误是使用 list.append 而不是 list.extend。感谢您的支持。

【讨论】:

    猜你喜欢
    • 2020-03-17
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多