【问题标题】:selecting data from list whiles keeping the order在保持顺序的同时从列表中选择数据
【发布时间】:2019-11-23 05:42:21
【问题描述】:

试图从列表中选择子集,但是选择后顺序颠倒了

尝试使用 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

【问题讨论】:

标签: python pandas numpy python-xarray


【解决方案1】:

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

数据

数据显示在这样的 xlsx 文件中。 输入是一个 xlsx 文档,它只有两次 1、2、.. 12、1、2、.. 12,“值”从 90 开始,从 10 开始一直计数到第二个 12。

流程

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 个月。

【讨论】:

  • 非常接近,只是我的新列表应该是 [10,11,12,1,2,3, 10,11,12,1,2,3 ...] 而不是 [10 , 10, 11, 11, 12, 12, 1, 1, 2, 2, 3, 3]
  • 是的,我觉得给我一分钟
  • 感谢它的工作原理,那么如何使用这个新列表正确地对数据框的实际值进行子集化呢?
  • 你能给我更多的上下文吗?我不确定我是否充分理解了您的问题,无法给出准确的答案。
  • 说这是我的DF月份值1 12.214394 2 -30.114391 3 1.343937 4 -29.290909 5 22.703789 6 14.211441 7 5.654198 8 -28.977440 9 8.361656 10 12.296993 11 18.193127 12 -20.491604 1 45.214394 2 10.885609 3 -14.656063 4 3.709091 5 8.703789 6 24.211441 7 -46.345802 我想使用我的列表来获取每个月的值,比如说 df[newlist] 但目前不起作用
【解决方案2】:

在你的情况下,我们使用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

【讨论】:

    【解决方案3】:

    我认为您可以获取每个类别的内容,然后使用 izip_longest 压缩这些列表。

    【讨论】:

      【解决方案4】:

      所以我从另一个来源找到了一种相对简单的方法

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 2018-12-11
        • 1970-01-01
        相关资源
        最近更新 更多