我正在尝试根据应用于第二个相同大小的数据帧的条件从数据框中的列中选择一个切片。我不使用列名,因此需要一个(我认为)使用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位数字)。在每列中,这些标识符从&#34; best&#34;中排序(在单独的程序中完成)。最坏的&#34;。 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行)中。然后,我想从permnos
的{{1}}返回切片。
是否可以&#34;沟通&#34;两个数据帧之间?如果是这样,我们非常感谢任何帮助。
答案 0 :(得分:1)
我认为&#34;沟通&#34;两个数据帧之间是不可能的,因为不同的对象。但是如果相同的长度和相同的索引可以在一个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的布尔索引不可用