根据另一个数据帧的条件值,从现有数据帧创建新数据帧

Ale*_*lex 1 python dataframe pandas

我尝试生成一个新的数据帧(expected_result),它基于两个现有的数据帧(排名、值)和一个过滤器。两个现有的数据名具有相同的标头和索引。如果数据帧“rank”中的值等于或小于filter_var,则新数据帧应显示数据帧“value”的值。如果排名高于filter_var = show "nan"

import pandas as pd

#df 1 Rank
ranking = {'Stock A':[1, 1, 1, 1],
           'Stock B':[3, 3, 4, 4],
           'Stock C':[4, 4, 3, 2],
           'Stock D':[2, 2, 2, 3],
           }

rank = pd.DataFrame(ranking)

#df 2 values
values = {'Stock A':[101, 102, 103, 104],
           'Stock B':[99, 99, 99 , 99],
           'Stock C':[99, 98, 100, 103],
           'Stock D':[100, 100, 100, 102],
           }

value = pd.DataFrame(values)

#Filter
filter_var = 2 #better or equal

#expecet result
results = {'Stock A':[101, 102, 103, 104],
           'Stock B':['nan', 'nan', 'nan' , 'nan'],
           'Stock C':['nan', 'nan', 'nan', 103],
           'Stock D':[100, 100, 100, 'nan'],
           }
#example results
expected_result = pd.DataFrame(results)
Run Code Online (Sandbox Code Playgroud)

感谢帮助

sop*_*les 5

pandas在索引上自动对齐,因此由于您有相同的索引index,因此您可以通过简单的方法来实现:

>>> value[rank.le(2)]

   Stock A  Stock B  Stock C  Stock D
0      101      NaN      NaN    100.0
1      102      NaN      NaN    100.0
2      103      NaN      NaN    100.0
3      104      NaN    103.0      NaN

# Create a new DF
res = value[rank.le(2)]
Run Code Online (Sandbox Code Playgroud)

pandas.le比较 DataFrames 是否小于或等于row明智或column明智。


括号中的代码返回一个布尔值 DataFrame,显示True值何时小于或等于 2:

>>> rank.le(2)

   Stock A  Stock B  Stock C  Stock D
0     True    False    False     True
1     True    False    False     True
2     True    False    False     True
3     True    False     True    False
Run Code Online (Sandbox Code Playgroud)

DFboolean以及您的 DF 共享相同的事实index,允许您选择[]具有所需值的行。因此为什么:

value[rank.le(2)]
Run Code Online (Sandbox Code Playgroud)

作品。