查找顶部和底部两行并将列值读入 Python 中的数据框

Find top and bottom two rows and read column value into a dataframe in Python

这是我的示例数据框。

df =pd.DataFrame({'Name':['Matt', 'John', 'Sam', 'Harry', 'Don', 'Julia', 'Chris', 'Nelson'],
           'Age': [30, 34, 56, 43, 67, 23, 19, 8],
           'Marks': [100, 200, 434, 543, 234, 412,678, 832],
           'Weight': [89, 56, 74, 34, 98, 102, 71, 80]})

我需要找出每列的两个最高值和两个最低值,return 这些行的名称和对应值。我可以单独获取它们,但有没有办法在一个代码 table 中将它们全部放在一起

这是我正在寻找的样本输出(最低值和最高值各 table)。下面的 table 是最高值。

Column Name Name Rank Value
Age Don 1 67
Age Sam 2 56
Marks Nelson 1 832
Marks Chris 2 678

有 80 多列。我是 Python 的新手,某种循环真的很有帮助。

使用nlargestnsmallest获取值并按concat制作数据框。

import pandas as pd
df =pd.DataFrame({'Name':['Matt', 'John', 'Sam', 'Harry', 'Don', 'Julia', 'Chris', 'Nelson'],
           'Age': [30, 34, 56, 43, 67, 23, 19, 8],
           'Marks': [100, 200, 434, 543, 234, 412,678, 832],
           'Weight': [89, 56, 74, 34, 98, 102, 71, 80]})
queries = []
for c in ['Age', 'Marks', 'Weight']:
  query = df.nlargest(2, [c])[['Name', c]].rename(columns={c: 'Value'}).reset_index(drop=True)
  query['Column Name'] = c
  query['Rank'] = query.index + 1
  query = query[['Column Name', 'Name', 'Rank', 'Value']]
  queries.append(query)
new_df = pd.concat(queries).reset_index(drop=True)
print(new_df)

这是我的尝试。仅处理最高值以说明该概念。这是使用附加方法的替代方法:

import pandas as pd

df =pd.DataFrame({'Name':['Matt', 'John', 'Sam', 'Harry', 'Don', 'Julia', 'Chris', 'Nelson'],
           'Age': [30, 34, 56, 43, 67, 23, 19, 8],
           'Marks': [100, 200, 434, 543, 234, 412,678, 832],
           'Weight': [89, 56, 74, 34, 98, 102, 71, 80]})

df_new =pd.DataFrame({'Column Name':[], 'Name':[], 'Rank':[], 'Value':[]})

for (columnName, columnData) in df.iteritems():
    if columnName == "Name":
        continue
    df2 = df.sort_values(by=[columnName], ascending=False).head(2).reset_index()
    for (columnName2, columnData2) in df2.iteritems():
        names = df2['Name']
        if columnName2 == columnName:
            for i in range(len(list(columnData2))):
                df_temp = {'Column Name':columnName, 'Name':names[i], 'Rank':i+1, 'Value':columnData2[i]}
                df_new = df_new.append(df_temp, ignore_index=True)


print(df_new)

输出:

  Column Name    Name  Rank  Value
0         Age     Don   1.0   67.0
1         Age     Sam   2.0   56.0
2       Marks  Nelson   1.0  832.0
3       Marks   Chris   2.0  678.0
4      Weight   Julia   1.0  102.0
5      Weight     Don   2.0   98.0