- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这不是 this question 的重复项:我们不是在比较指数
让我创建两个 DataFrame 以便您理解来说明我想要的内容。
A = pd.DataFrame([[1], [1], [2], [2], [3], [4], \
[4], [5], [6], [6], [7], [8]], columns = ['Number'])
B = pd.DataFrame([[1, 3, 'CAT'], [4, 6, 'DOG'], [7, 7, 'COW']], \
columns = ['start', 'end', 'animal'])
是我的两个数据框。
print(A)
产量
Number
0 1
1 1
2 2
3 2
4 3
5 4
6 4
7 5
8 6
9 6
10 7
11 8
和
print(B)
产量:
start end animal
0 1 3 CAT
1 4 6 DOG
2 7 7 COW
所以我的start
和end
范围在B
中给出,基于这个范围,我想填充A
带有一个新列,如果 A
中的 Number
列下降,该新列将保存 B
中的 animal
值在 start
和 end
范围内(包括 B
)。
所以我想修改相同的 DataFrame A
看起来像;
Number Animal
0 1 CAT
1 1 CAT
2 2 CAT
3 2 CAT
4 3 CAT
5 4 DOG
6 4 DOG
7 5 DOG
8 6 DOG
9 6 DOG
10 7 COW
11 8 None
请记住,这只是一个供您构建的演示数据框,实际上,这两个数据框包含许多行和许多列,因此这必须尽可能高效!
<小时/>这是我尝试过的:
我创建了一个字典来存储范围映射..
rangeMapping = {}
for index, row in B.iterrows():
rangeMapping[row[2]] = (row[0], row[1])
打印这个print(rangeMapping)
{'猫': (1, 3), '牛': (7, 7), '狗': (4, 6)}
A['Animal'] = '' #Creating any empty column with empty string
然后,我遍历 A
中的每一行,然后,我会迭代 key, (start, end)
对 >rangeMapping
字典,查看 A
中的行值是否大于或等于 start
且小于或等于 end
,然后将动物名称 key
添加到字符串
for index, row in A.iterrows():
for key, value in rangeMapping.items():
if((row[0] >= value[0]) and (row[0] <= value[1])):
row[1] = row[1] + key
print(row[1])
break
正在打印更新的列,或者更确切地说,需要按值更新的列
CAT
CAT
CAT
CAT
CAT
DOG
DOG
DOG
DOG
DOG
COW
但是我的 DataFrame A
在第二列中仍然有空字符串..
Number Animal
0 1
1 1
2 2
3 2
4 3
5 4
6 4
7 5
8 6
9 6
10 7
11 8
我知道,首先,我的代码甚至不是逐行更新的正确方法,即使是这样也没有办法有效,因为实际上,我的 DataFrame A
有8000 行,包含 start
和 end
列的 DataFrame B
有 500 行。有没有更有效的方法来做到这一点? (就是这一点我真羡慕那些懂得pandas
和subsetting
、iloc
、loc
、索引重置
相关命令非常好)
编辑:在A
中的DataFrame中包含另一个值,该值在B
中没有范围
最佳答案
您可以使用 IntervalIndex
和 .loc
B.index=pd.IntervalIndex.from_arrays(B['start'],B['end'],closed='both')
A['Yourcolumn']=B.animal.loc[A.Number].values
A
Out[1577]:
Number Yourcolumn
0 1 CAT
1 1 CAT
2 2 CAT
3 2 CAT
4 3 CAT
.. ... ...
6 4 DOG
7 5 DOG
8 6 DOG
9 6 DOG
10 7 COW
[11 rows x 2 columns]
更新
B.index=pd.IntervalIndex.from_arrays(B['start'],B['end'],closed='both')
s=sum([list(range(x,y+1)) for x,y in zip(B.start,B.end)],[])
v=A.Number[A.Number.isin(s)]
A.loc[v.index,'Yourcolumns']=B.loc[v].animal.values
A
Out[1652]:
Number Yourcolumns
0 1 CAT
1 1 CAT
2 2 CAT
3 2 CAT
4 3 CAT
.. ... ...
7 5 DOG
8 6 DOG
9 6 DOG
10 7 COW
11 8 NaN
[12 rows x 2 columns]
关于python - 根据数据帧 B 中其他两列给出的范围填充数据帧 A 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49697940/
我是一名优秀的程序员,十分优秀!