从列表中选择数据,同时保持顺序

时间:2019-07-14 02:39:51

标签: python pandas numpy python-xarray

试图从列表中选择子集,但是选择后顺序相反

使用pandas isin尝试

df.mon =[1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12,...] 
 # selecting 
 results = df[df.month.isin([10,11,12,1,2,3])]
 print(results.mon]
 mon = [1,2,3,10,11,12, 1,2,3,10,11,12,...]
 desired results
 mon= [10,11,12,1,2,3,10,11,12,1,2,3,...]

 # sorting results in this
 mon = [1,1,2,2,3,3,10,10,11,11,12,12] and I dont want that either

 thanks for the help

4 个答案:

答案 0 :(得分:1)

我最常使用基本的python列表,因此我已将df转换为列表。

数据

数据显示在xlsx文件中,如下所示。 输入是一个xlsx文档,该文档仅出现1、2,.. 12、1、2..12两次,“值”从90开始,再由10一直计数到第二个12。

A portion of the xlsx file

过程

import pandas as pd

df = pd.read_excel('Book1.xlsx')
arr = df['Column'].tolist()
arr2 = df['Values'].tolist()

monthsofint = [10, 11, 12, 1, 2, 3]

locs = []

dictor = {}
for i in range(len(monthsofint)):
    dictor[monthsofint[i]] = []

for i in range(len(monthsofint)):  # !! Assumption !!
    for j in range(len(arr)):
        if monthsofint[i] == arr[j]:
            dictor[monthsofint[i]].append(j)

newlist = []
newlist2 = []
for i in range(len(dictor[monthsofint[0]])):
    for j in range(len(monthsofint)):
        newlist.append(arr[dictor[monthsofint[j]][i]])
        newlist2.append(arr2[dictor[monthsofint[j]][i]])

print(newlist)
print(newlist2)

输出:[10, 11, 12, 1, 2, 3, 10, 11, 12, 1, 2, 3][180, 190, 200, 90, 100, 110, 300, 310, 320, 210, 220, 230]

关于假设的注意事项:假设文件中每年总是存在12个月。

答案 1 :(得分:1)

在您的情况下,我们使用Categorical + cumcount

#results = df[df.mon.isin([10, 11, 12, 1, 2, 3])].copy()
results.mon=pd.Categorical(results.mon,[10,11,12,1,2,3])
s=results.sort_values('mon')
s=s.iloc[s.groupby('mon').cumcount().argsort()]
s
Out[172]: 
   mon
9   10
10  11
11  12
0    1
1    2
2    3
21  10
22  11
23  12
12   1
13   2
14   3

答案 2 :(得分:0)

我认为您可以采用我们为每个类别提供的功能,然后使用izip_longest压缩这些列表。

答案 3 :(得分:0)

所以我找到了一个相对简单的方法来从另一个来源进行操作

对于那些可能感兴趣的人:

  df[(df.index > 4) & (df.month.isin([10, 11, 12, 1, 2, 3]))]