【问题标题】:Pandas Dataframe Query - Location of highest value per rowPandas Dataframe Query - 每行最高值的位置
【发布时间】:2021-05-10 17:49:37
【问题描述】:

我下面的代码生成了一个小数据框,旨在成为一个虚构的奥运会奖牌表。

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.randint(0, 47, 20).reshape(4,5), 
                   index = ['USA', 'USR', 'ITL', 'GBR'],
                   columns=[1996, 2000, 2004, 2008, 2102])

df['Highest'] = df.max(axis=1).round()
df = df.sort_values('Highest', ascending = False).head(10)
df

我在末尾添加了一列来确定每行(国家)的最高奖牌数。

我需要添加一个额外的“年份”列,用于添加每行获得最高奖牌的年份。

因此,如果第 1 行的奖牌数量最多的是在 2012 年获得的,则应将 2012 的值添加到新的“年份”列的第 1 行。

我该怎么做?

谢谢

【问题讨论】:

  • 请不要粘贴图片。向我们展示一些示例输入,我们可以复制并输出您想要的。
  • 发图片是不是很不礼貌?
  • 是的。我们想要一些可以复制和处理的东西。如果您粘贴图像,我们必须手动创建一个数据框来测试一些解决方案。
  • 在上面的示例中,您需要访问与我相同的数据帧才能运行代码并获得相同的输出。还是我错过了什么?问题不在于我到目前为止生成的输出,而在于我需要改进我的代码,如上面突出显示的那样。抱歉,这里是新人,正在学习绳索... :)
  • 啊,好的。我和你在一起。感谢您帮助我解决这里的工作方式:)

标签: python-3.x pandas dataframe csv


【解决方案1】:

这是查找索引位置的一个选项,然后查找年份。您可以根据需要进行调整以适应您的目的。先创建随机df。

使用.index 给出一个列表;在这种情况下,列表最多为一个元素,因此请使用[0] 从列表中获取值

然后使用.at 获取最大值的年份。

df = pd.DataFrame(data={'Year': range(2000, 2010), 'Value': np.random.uniform(low=0.5, high=13.3, size=(10,))}, columns=['Year', 'Value'])
max_value = df.Value.max()
idx_max_value = df.loc[df.Value == max_value].index[0]
year_at_max_value = df.at[idx_max_value,'Year']

【讨论】:

    【解决方案2】:

    可能不是最 Pythonic 的解决方案,但这是可行的:

    year = []
    for x in range(len(df)):
        pip = np.array(df.iloc[x, :5])
        i = np.argmax(pip)
        year.append(df.columns[i])
    df['Year'] = year
    

    【讨论】:

      猜你喜欢
      • 2019-10-18
      • 2017-12-17
      • 2018-03-24
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2019-05-27
      相关资源
      最近更新 更多