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

标签 python pandas numpy dataframe

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

相关文章:

python - 替换字符串中的日期时间字符

python - Pandas:从列值重构数据框

python - 如何对 pandas 数据框中的字母数字列进行排序

python - 如何在不连接的情况下读取 Python 数据框中的数据?

python - Scikit Learn SVC decision_function 和 predict

python - 无法获取正确的像素颜色图像python

用于可移植应用程序的 Python GUI

python - 使用 Pandas 将一列字典拆分/分解为单独的列

python - 如果包含单个 NaN 并组合列,则将整个组设置为 NaN

python - 使用 numpy.random.normal 时如何指定上限和下限