将值附加到DataFrame行使用lambda if else。

huangapple go评论99阅读模式
英文:

Append value to df row using lambda if else

问题

你好,专家们,我在尝试将值附加到DataFrame的新列时遇到了问题,需要通过比较其他列的值来实现。我搜索了相关的问题,但没有找到合适的答案。我是Python的新手。

我想通过比较DataFrame的其他列的最后4个值,使用df.applylambda来在每个元素的最后一行附加一个新的DataFrame列。在这方面的帮助将不胜感激。

我有以下DataFrame:

  1. Symbol open close sig
  2. 0 APPL 153.60 152.90 0
  3. 1 APPL 152.90 153.55 1
  4. 2 APPL 153.55 152.00 0
  5. 3 APPL 152.00 153.50 1
  6. 4 APPL 153.50 154.10 1
  7. 5 TSLA 193.00 192.10 0
  8. 6 TSLA 192.10 191.50 0
  9. 7 TSLA 191.50 192.90 1
  10. 8 TSLA 192.90 192.45 0
  11. 9 TSLA 192.45 191.10 0

我想要比较df['sig']列,除了第1行,以此类推,对于所有的股票,如果sig列的最后4个值为APPL是1011,那么在第4行应该附加为1(即每支股票的最后一行)。如果TSLA的sig列的最后4个值为0100,那么在第9行应该附加为0。

通过使用lambda函数或df.npwhere等方法...

谢谢!

期望的结果如下:

  1. Symbol open close sig signal
  2. 0 APPL 153.60 152.90 0 NaN
  3. 1 APPL 152.90 153.55 1 NaN
  4. 2 APPL 152.75 152.00 0 NaN
  5. 3 APPL 153.00 153.50 1 NaN
  6. 4 APPL 153.50 154.10 1 1
  7. 5 TSLA 193.00 192.10 0 NaN
  8. 6 TSLA 192.10 191.50 0 NaN
  9. 7 TSLA 191.50 192.90 1 NaN
  10. 8 TSLA 192.90 192.45 0 NaN
  11. 9 TSLA 192.45 191.10 0 0
英文:

hello experts i was struck in appending value to new column of df by comparing other column values. i searched related questions but not found suitable answer. I'm newbie to python

I want to append new column of df at last row of each element by comparing last 4 values of df other column using df.apply lambda help in this regard highly appreciated.

I have following df:

  1. Symbol open close sig
  2. 0 APPL 153.60 152.90 0
  3. 1 APPL 152.90 153.55 1
  4. 2 APPL 153.55 152.00 0
  5. 3 APPL 152.00 153.50 1
  6. 4 APPL 153.50 154.10 1
  7. 5 TSLA 193.00 192.10 0
  8. 6 TSLA 192.10 191.50 0
  9. 7 TSLA 191.50 192.90 1
  10. 8 TSLA 192.90 192.45 0
  11. 9 TSLA 192.45 191.10 0

i want to compare df['sig'] column except 1 row and so on for all stocks, if sig column last 4 values APPL is 1011 then df ['signal'] at row 4 it should be appended as 1 (i.e. last row of each stock) if last 4 values df['sig'] of TSLA is 0100 then at 9 row df['signal'] to be appended as 0

by using lambda or df.npwhere etc...

Thanks!

expected this:

  1. Symbol open close sig signal
  2. 0 APPL 153.60 152.90 0 NaN
  3. 1 APPL 152.90 153.55 1 NaN
  4. 2 APPL 152.75 152.00 0 NaN
  5. 3 APPL 153.00 153.50 1 NaN
  6. 4 APPL 153.50 154.10 1 1
  7. 5 TSLA 193.00 192.10 0 NaN
  8. 6 TSLA 192.10 191.50 0 NaN
  9. 7 TSLA 191.50 192.90 1 NaN
  10. 8 TSLA 192.90 192.45 0 NaN
  11. 9 TSLA 192.45 191.10 0 0

答案1

得分: 1

以下是您要翻译的内容:

You can use a groupby.rolling:

  1. df['signal'] = (df.groupby('Symbol')['sig'].rolling(4)
  2. .apply(lambda x: x.eq([1, 0, 1, 1]).all()).droplevel(0)
  3. )

Output:

  1. Symbol open close sig signal
  2. 0 APPL 153.60 152.90 0 NaN
  3. 1 APPL 152.90 153.55 1 NaN
  4. 2 APPL 152.75 152.00 0 NaN
  5. 3 APPL 153.00 153.50 1 0.0
  6. 4 APPL 153.50 154.10 1 1.0
  7. 5 TSLA 193.00 192.10 0 NaN
  8. 6 TSLA 192.10 191.50 0 NaN
  9. 7 TSLA 191.50 192.90 1 NaN
  10. 8 TSLA 192.90 192.45 0 0.0
  11. 9 TSLA 192.45 191.10 0 0.0

mapping custom values for each group:

  1. mapper = {'APPL': ([1, 0, 1, 1], 1), 'TSLA': ([0, 1, 0, 0], 0)}
  2. df['signal'] = (
  3. df.groupby('Symbol')['sig']
  4. .apply(lambda g: g.rolling(4)
  5. .apply(lambda x: mapper[g.name][1]
  6. if x.tolist() == mapper[g.name][0]
  7. else float('nan')
  8. )
  9. )
  10. )

Output:

  1. Symbol open close sig signal
  2. 0 APPL 153.60 152.90 0 NaN
  3. 1 APPL 152.90 153.55 1 NaN
  4. 2 APPL 153.55 152.00 0 NaN
  5. 3 APPL 152.00 153.50 1 NaN
  6. 4 APPL 153.50 154.10 1 1.0
  7. 5 TSLA 193.00 192.10 0 NaN
  8. 6 TSLA 192.10 191.50 0 NaN
  9. 7 TSLA 191.50 192.90 1 NaN
  10. 8 TSLA 192.90 192.45 0 NaN
  11. 9 TSLA 192.45 191.10 0 0.0
英文:

You can use a groupby.rolling:

  1. df['signal'] = (df.groupby('Symbol')['sig'].rolling(4)
  2. .apply(lambda x: x.eq([1, 0, 1, 1]).all()).droplevel(0)
  3. )

Output:

  1. Symbol open close sig signal
  2. 0 APPL 153.60 152.90 0 NaN
  3. 1 APPL 152.90 153.55 1 NaN
  4. 2 APPL 152.75 152.00 0 NaN
  5. 3 APPL 153.00 153.50 1 0.0
  6. 4 APPL 153.50 154.10 1 1.0
  7. 5 TSLA 193.00 192.10 0 NaN
  8. 6 TSLA 192.10 191.50 0 NaN
  9. 7 TSLA 191.50 192.90 1 NaN
  10. 8 TSLA 192.90 192.45 0 0.0
  11. 9 TSLA 192.45 191.10 0 0.0

mapping custom values for each group:

  1. mapper = {'APPL': ([1, 0, 1, 1], 1), 'TSLA': ([0, 1, 0, 0], 0)}
  2. df['signal'] = (
  3. df.groupby('Symbol')['sig']
  4. .apply(lambda g: g.rolling(4)
  5. .apply(lambda x: mapper[g.name][1]
  6. if x.tolist() == mapper[g.name][0]
  7. else float('nan')
  8. )
  9. )
  10. )

Output:

  1. Symbol open close sig signal
  2. 0 APPL 153.60 152.90 0 NaN
  3. 1 APPL 152.90 153.55 1 NaN
  4. 2 APPL 153.55 152.00 0 NaN
  5. 3 APPL 152.00 153.50 1 NaN
  6. 4 APPL 153.50 154.10 1 1.0
  7. 5 TSLA 193.00 192.10 0 NaN
  8. 6 TSLA 192.10 191.50 0 NaN
  9. 7 TSLA 191.50 192.90 1 NaN
  10. 8 TSLA 192.90 192.45 0 NaN
  11. 9 TSLA 192.45 191.10 0 0.0

huangapple
  • 本文由 发表于 2023年2月14日 21:51:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/75448817.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定