簡體   English   中英

在 Pandas Read_excel 中使用 UseCols 時保持列的原始順序

[英]Keeping columns in the original order when using UseCols in Pandas Read_excel

pandas.read_excel 中的 USECOLS 正在按列值的升序對我的列表進行排序。

我有一個清單。 此列表不是恆定的,並且會因代碼而異。 indexList = [3,6,5,18,19]

一旦我將此列表傳遞給 pandas.read_excel,USECOLS 將按升序對我的 output dataframe 進行排序: [3,5,6,18,19]

我需要它的順序與我傳遞它的順序相同,即[3,6,5,18,19]

Indexlist = [3,6,5,18,19]

#inside a function to which Indexlist  is passed as a parameter

    excel_data_df = pandas.read_excel('MasterFiltered.xlsx',   
                                          sheet_name='Sheet1',                                       
                                          usecols=indexList, #indexList is a variable List                
                                          dtype={'school: str,
                                          'class': str,
                                          'name': str,
                                          'subject': str,
                                          'school': str}) # datatype -- line X
    df_filtered = excel_data_df.loc[excel_data_df["cityname"]==i_city_name]# Row Filtering
    print(df_filtered) # Output is sorted excel ascending order of columns - [3,5,6,18,19] 

注意:在 Stack 中查找答案時提到要使用列名和列索引,但在我的情況下這是不可能的,因為列會不斷變化。

我發現的一個非常相似的問題/答案是: 在 Pandas Read_CSV 中使用 UseCols 時按指定順序保持列

但是當我在 X 行的末尾給出 [indexList] 類似於上面的答案時,我得到錯誤: raise KeyError(f"None of [{key}] are in the [{axis_name}]")

請幫助

閱讀文件后,使用np.argsort重新排序列:

import pandas as pd
import numpy as np

Indexlist = [3, 6, 5, 18, 19]
df = pd.read_excel('data.xlsx', usecols=Indexlist)
print(df)

out = df.iloc[:, np.argsort(Indexlist)]
print(out)


# Output of df:
   D  F  G   S   T
0  3  5  6  18  19


# Output of out:
   D  G  F   S   T
0  3  6  5  18  19

嘗試這個:

Indexlist = [3,2]
col_names=pd.read_excel('data.xlsx', nrows=1).columns
df = pd.read_excel('data.xlsx', usecols=Indexlist)
df = df[col_names[Indexlist]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM