【问题标题】:Problems with Replace - pandas dataframe替换问题 - 熊猫数据框
【发布时间】:2013-02-04 08:48:06
【问题描述】:

我有一个 df

df:
  date     shares  symbol  date2
0 20120614  1100   AAT.N   NaN
1 20120615  1100   AAT.N   NaN
2 20120616  1100   AAT.N   NaN
3 20120617  1100   AAT.N   NaN
4 20030405  800    ABT.N   NaN
5 20030406  800    ABT.N   NaN
6 20030407  800    ABT.N   NaN
...

#This is what I want:
df:
  date     shares  symbol  date2
0 20120614  1100   AAT.N   20120615
1 20120615  1100   AAT.N   20120616
2 20120616  1100   AAT.N   20120617
3 20120617  1100   AAT.N   NaN
4 20030405  800    ABT.N   20030406
5 20030406  800    ABT.N   20030407
6 20030407  800    ABT.N   NaN
...

我想用 df.ix[1]['date2'] 替换每个符号的 df.ix[0]['date2'] -- 符号在数据帧中发生变化,所以我不能只通过整个数据框。

我要循环遍历,如果 i 和 i+1 的符号匹配:

df.ix[i]['symbol'] == df.ix[i+1]['symbol']

我打算用日期替换 NaN。

我试过了:

df.ix[i]['date2'] = df.ix[i+1]['date']  ##This failed.

然后我尝试了:

a = df.ix[i+1]['date']
df.replace({'date2': i}, a)
###This failed as well

这里有任何建议

1) 完成此任务的最佳流程?

2) 基本问题:如何替换 pandas DF 中的 NaN(甚至是另一个数字)?

谢谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这里有一个可能是最“流行”的单行解决方案:

    In [8]: df['date2'] = df.groupby('symbol').apply(lambda x: x['date'].shift(-1))
    
    In [9]: df
    Out[9]:
           date  shares symbol     date2
    0  20120614    1100  AAT.N  20120615
    1  20120615    1100  AAT.N  20120616
    2  20120616    1100  AAT.N  20120617
    3  20120617    1100  AAT.N       NaN
    4  20030405     800  ABT.N  20030406
    5  20030406     800  ABT.N  20030407
    6  20030407     800  ABT.N       NaN
    

    【讨论】:

    • 和 DSM 状态一样,如果您有相同符号的不同组要保持不同,这将不起作用。
    • 加 1 用于使用 .apply() 我的解决方案使用 for 循环。我总是忘记申请。
    • 你甚至可以用df.groupby("symbol").date.shift(-1)省略lambda函数。 groupby 对象将调度到底层的 Series/DataFrame 方法 (pandas.pydata.org/pandas-docs/stable/…)
    【解决方案2】:

    为了与 DSM 的布尔解决方案进行比较,这里是快速且轻松的 groupby 解决方案!

    grouped = df.groupby('symbol')
    for _, group in grouped:
        df1['date2'][group.index] = group.shift(-1)['date']
    

    【讨论】:

      【解决方案3】:

      我可能会这样做:

      >>> df
             date  shares symbol  date2
      0  20120614    1100  AAT.N    NaN
      1  20120615    1100  AAT.N    NaN
      2  20120616    1100  AAT.N    NaN
      3  20120617    1100  AAT.N    NaN
      4  20030405     800  ABT.N    NaN
      5  20030406     800  ABT.N    NaN
      6  20030407     800  ABT.N    NaN
      >>> same_symbols = df['symbol'] == df['symbol'].shift(-1)
      >>> df['date2'][same_symbols] = df['date'].shift(-1)
      >>> df
             date  shares symbol     date2
      0  20120614    1100  AAT.N  20120615
      1  20120615    1100  AAT.N  20120616
      2  20120616    1100  AAT.N  20120617
      3  20120617    1100  AAT.N       NaN
      4  20030405     800  ABT.N  20030406
      5  20030406     800  ABT.N  20030407
      6  20030407     800  ABT.N       NaN
      

      这会找到从一行到下一行的符号相同的地方:

      >>> same_symbols
      0     True
      1     True
      2     True
      3    False
      4     True
      5     True
      6    False
      Name: symbol, Dtype: bool
      

      然后在那里应用移位的日期:

      >>> df['date'].shift(-1)
      0    20120615
      1    20120616
      2    20120617
      3    20030405
      4    20030406
      5    20030407
      6         NaN
      Name: date, Dtype: float64
      

      这假设符号数据是连续的并且已经排序(如果不是这样的话,很容易强加。)

      或者,您可以使用groupby,然后对每个组采取行动,最后重新组装。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-02
        • 2022-06-24
        • 2018-09-29
        • 2020-04-21
        • 1970-01-01
        相关资源
        最近更新 更多