首页 文章

在单独的数据帧上使用条件选择数据帧切片

提问于
浏览
0

我试图根据应用于第二个相同大小的数据帧的条件从数据框中的列中选择一个切片 . 我不使用列名,因此需要一个(我认为)使用iloc的解决方案 .

这是我的代码:

import pandas as pd

permnos = pd.read_csv('Ranks.csv')
total_cols = len(permnos.columns)

pntls = permnos.copy(deep=True)

for i in range(total_cols):
    for j in range(pntls.iloc[:,i].count()):
        pntls.iloc[j,i] = (j+1)/pntls.iloc[:,i].count()

print((pntls.iloc[:,0] > 0.1) & (pntls.iloc[:,0] <= 0.2))

#print(permnos.iloc[(pntls.iloc[:,0] > 0.1) & (pntls.iloc[:,0] <= 0.2), 0])

数据框 permnos 包含具有各种行长度的列的标识符(5位数字) . 在每列中,这些标识符从"best"到"worst"进行排序(在单独的程序中完成) . for循环写入数据帧 pntls ,以便根据位置为 permnos 的每列中的每个元素创建百分比等级 . 也就是说, pntls 的每一列中的值按照从0到1的升序排列 . 通过这一步,一切都很好 .

在我当前注释掉的那行(问题)中,我试图打印 permnos 的第0列中的元素,其中 pntls 的第0列中的值大于0.1且小于或等于0.2 . [注意:一旦我弄清楚如何实际选择所需的元素,我的代码将使用.tolist()将切片添加到列表中;如果我能得到切片的话,我想我已经解决了这个问题 . 目前已注释掉的产品线产量:

NotImplementedError:对整数类型的基于iLocation的布尔索引不可用

为了给出我所需输出的示例,假设在 pntls 的第0列中,0.1到0.2之间的值在第5行到第8行(包括第5行和第8行)中 . 然后我想从 permnospermnos.iloc[5:9, 0] 返回切片 .

是否可以在两个数据帧之间进行“通信”?如果是这样,非常感谢任何帮助 .

1 回答

  • 1

    我认为两个数据帧之间的"communicate"是不可能的,因为不同的对象 . 但是如果相同的长度和相同的索引是可能的,则在一个 df 中创建掩码并将其应用于第二个 .

    如果不同的索引(但长度相同)也可以过滤,那么就需要将 .values 添加到 mask ,如 permnos[m.values].iloc[:, 0] 为布尔numpy数组 .

    pntls  = pd.DataFrame({'B':[.2,.1,.12,.4,.15,.4],
                       'C':[7,8,9,4,2,3],
                       'D':[1,3,5,7,1,0],
                       'E':[5,3,6,9,2,4]})
    
    print (pntls)
          B  C  D  E
    0  0.20  7  1  5
    1  0.10  8  3  3
    2  0.12  9  5  6
    3  0.40  4  7  9
    4  0.15  2  1  2
    5  0.40  3  0  4
    

    m = (pntls.iloc[:,0] > 0.1) & (pntls.iloc[:,0] <= 0.2)
    print (m)
    0     True
    1    False
    2     True
    3    False
    4     True
    5    False
    Name: B, dtype: bool
    
    permnos  = pd.DataFrame({'a':[7,8,9,4,2,3],
                       'b':[1,3,5,7,1,0],
                       'c':[1,3,5,7,1,0],
                       'd':[5,3,6,9,2,4]})
    
    print (permnos)
       a  b  c  d
    0  7  1  1  5
    1  8  3  3  3
    2  9  5  5  6
    3  4  7  7  9
    4  2  1  1  2
    5  3  0  0  4
    

    首先按boolean indexing过滤,然后选择:

    df = permnos[m].iloc[:, 0]
    print (df)
    0    7
    2    9
    4    2
    Name: a, dtype: int64
    

    使用 loc 并通过切片选择列名称:

    df = permnos.loc[m, permnos.columns[0]]
    print (df)
    0    7
    2    9
    4    2
    Name: a, dtype: int64
    

    原始解决方案返回:

    df = permnos.iloc[m, 0]
    print (df)
    

    NotImplementedError:对整数类型的基于iLocation的布尔索引不可用

相关问题