gpt4 book ai didi

python - 根据数据帧 B 中其他两列给出的范围填充数据帧 A 中的列

转载 作者:行者123 更新时间:2023-12-01 09:33:59 26 4
gpt4 key购买 nike

这不是 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

所以我的startend范围在B中给出,基于这个范围,我想填充A 带有一个新列,如果 A 中的 Number 列下降,该新列将保存 B 中的 animal 值在 startend 范围内(包括 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 行,包含 startend 列的 DataFrame B 有 500 行。有没有更有效的方法来做到这一点? (就是这一点我真羡慕那些懂得pandassubsettingilocloc索引重置相关命令非常好)

编辑:在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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com