根據我的問題here和here,我想對熊貓資料框串列進行排序,并根據所需的順序(here len),我想以與更改的值idx相同的方式更改變數的值lst。表示如果 lst = [df1, df2, df3] 和 idx = [1,2,3] 并且有序串列 (by len) 是lst_new = [df3, df1, df2], 那么idx_new = [3,1,2]. 說明我的問題的一個小例子是:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [11, 12, 13]]),
columns=['a', 'b', 'c'])
df3 = pd.DataFrame(np.array([[1, 2, 3], ['x', 'y', 'z']]),
columns=['a', 'b', 'c'])
idx = [1,2,3]
lst = []
lst.append(df1)
lst.append(df2)
lst.append(df3)
lst = sorted(lst, key=len)
test = [i for j, i in sorted(zip(lst, idx))]
print(test)
得到錯誤資訊:
ValueError: Can only compare identically-labeled DataFrame objects
uj5u.com熱心網友回復:
您的初步嘗試很好,只需要正確的按鍵功能即可進行排序。這是如何做到的。
lst = [df1, df2, df3] # Given the list of dataframes...
# Decorate each dataframe with its initial index
# and sort.
# Use a key that takes the length of the dataframe still.
# Input here: [(1, df1), (2, df2), (3, df3)]
# Output here: [(3, df3), (1, df1), (2, df2)] (or whatever is the correct order)
lst_sort = sorted(enumerate(lst, start=1), key=lambda tup: len(tup[1]))
# now split the index and dataframe lists apart again if needed
# by using a trick where it feels like we use zip in reverse
indexes, dataframes = zip(*lst_sort)
如果您需要更多示例,請參閱 Python 檔案中的Sorting HOWTO。
注意:我在start=1這里使用 1 作為問題中的第一個索引,但 Python 中的索引通常按約定從 0 開始,因為串列是以這種方式索引的,所以如果這樣更方便,請考慮使用基于 0 的索引。
uj5u.com熱心網友回復:
找到了一些或多或少復雜的解決方案:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['a', 'b', 'c'])
df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [11, 12, 13]]),
columns=['a', 'b', 'c'])
df3 = pd.DataFrame(np.array([[1, 2, 3], ['x', 'y', 'z']]),
columns=['a', 'b', 'c'])
idx = [1,2,3]
lst = []
lst.append(df1)
lst.append(df2)
lst.append(df3)
lst_srt = sorted(lst, key=len)
i = 0
idx_lst = []
for a in lst_srt:
i = 0
for b in lst:
i = i 1
if a.equals(b):
idx_lst.append(i)
break
print(idx_lst)
print(lst_srt)
和:
[3, 1, 2]
[ a b c
0 1 2 3
1 x y z, a b c
0 1 2 3
1 4 5 6
2 7 8 9, a b c
0 1 2 3
1 4 5 6
2 7 8 9
3 11 12 13]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/496121.html
