首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫:新列中与前几行差异的最大值列表

熊猫:新列中与前几行差异的最大值列表
EN

Stack Overflow用户
提问于 2021-06-16 03:18:24
回答 3查看 336关注 0票数 0

我想在这个dataframe中添加一个新列“最佳”,其中包含符合以下条件的列的名称:

  • 从每列的当前值减去2行
  • 行中的值如果多个列共享相同的最高结果,则具有此减法结果最高结果的列将在“最佳”
  • 中列出,如果所有列都有相同的结果,则它们都会得到列出的

输入:

代码语言:javascript
运行
复制
   A  B  C
0  1  2  3
1  3  2  1
2  5  2  4
3 -3  0  2
4  6  3  4

期望的结果:

代码语言:javascript
运行
复制
   A  B  C        BEST
0  1  2  3          []
1  3  2  1          []
2  5  2  4       ['A']
3 -3  0  2       ['C']
4  6  3  4  ['A', 'B']

对新列“最佳”中每一行的结果的解释:

  • Rows 0和1:空列表中的“最佳”,因为2行后退不存在。

  • Row 2:计算列A: 5-1= 4,B列:2-2= ,C列:4-3= 1 ->最高为'A'

  • Row 3:计算A列:-3 -1= -4,B列:0-2= -2,C列:2-3= -1 ->最高为'C'

  • Row 4:计算列A: 6-5= 1,B列:3-2= 1,C列:4-4= ->最高值均为'A','B'

生成数据的代码:

代码语言:javascript
运行
复制
import io, pandas as pd

df = io.StringIO("""
A|B|C
1|2|3
3|2|1
5|2|4
-3|0|2
6|3|4
""")
df = pd.read_csv(df, sep='|')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-16 03:30:47

您可以使用shift()apply()np.where来做到这一点。试试这个:

代码语言:javascript
运行
复制
df['Best'] = (df - df.shift(2)).iloc[2:].apply(lambda x: list(df.columns[np.where(x==max(x))]), axis=1)

输出:

代码语言:javascript
运行
复制
print(df)

A   B   C   Best
0   1   2   3   NaN
1   3   2   1   NaN
2   5   2   4   [A]
3   -3  0   2   [C]
4   6   3   4   [A, B]
票数 2
EN

Stack Overflow用户

发布于 2021-06-16 03:29:19

首先使用shiftsubtract获得差异,然后用列名替换最大值,然后删除其他值。

代码语言:javascript
运行
复制
df['BEST'] = (
    df.subtract(df.shift(2))
    .apply(lambda x: [df.columns[i] for i,e in enumerate(x) if e==max(x)], axis=1)
)

    A   B   C   BEST
0   1   2   3   []
1   3   2   1   []
2   5   2   4   [A]
3   -3  0   2   [C]
4   6   3   4   [A, B]
票数 3
EN

Stack Overflow用户

发布于 2021-06-16 03:29:35

尝试:

代码语言:javascript
运行
复制
maximum=df.sub(df.shift(2)).max(skipna=False,axis=1)
#finded the maximum value
df['Best']=(df.where(df.sub(df.shift(2)).isin(maximum))
          .T
          .apply(lambda x:x.dropna().index.tolist()))

df输出

代码语言:javascript
运行
复制
    A   B   C   Best
0   1   2   3   []
1   3   2   1   []
2   5   2   4   [A]
3   -3  0   2   [C]
4   6   3   4   [A, B]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67995888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档