查找顶部和底部两行并将列值读入 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 的新手,某种循环真的很有帮助。
使用nlargest
和nsmallest
获取值并按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
这是我的示例数据框。
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 的新手,某种循环真的很有帮助。
使用nlargest
和nsmallest
获取值并按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