我有一个 DataFrame,其中对于每一列,我只想根据索引显示特定值,但这些条件对于每一列都是不同的。它看起来像这样:
data = {'a': [1,2,3,4,5],
'b': [10,20,30,40,50],
'c': [1,1,1,1,1]}
df = pd.DataFrame(data)
df:
a b c
0 1 10 1
1 2 20 1
2 3 30 1
3 4 40 1
4 5 50 1
我现在想要取“a”的索引 <3、“b”的索引 <2 和“c”的索引 = 4 的值。结果如下:
a b c
0 1.0 10.0 NaN
1 2.0 20.0 NaN
2 3.0 NaN NaN
4 NaN NaN 1.0
我尝试了以下操作:
import pandas as pd
df_a = df.loc[df.index<3, 'a']
df_b = df.loc[df.index<2, 'b']
df_c = df.loc[df.index==4, 'c']
df_result = pd.concat([df_a, df_b, df_c], axis=1)```
这给出了所需的结果,但有没有更有效的方法来实现这一点?因此,如果我有一个“<”条件列表和一个“=”条件列表,那么我可以一次性创建结果过滤器吗?如果 NaN 变为零,那就没问题了,因为无论如何,这最终都是我想要的。
您的方法很好,您可以使用字典理解来实现自动化
operator
:使用字符串和的变体
query
:输出:
该
query
方法可以轻松定义复杂的条件:另一种可能的解决方案,其步骤如下:
该
np.stack
函数将这些布尔值堆叠起来conds
,生成一个二维数组,然后将其转置,以将掩码与原始数组正确对齐df
。[np.where
然后] 2函数评估这些,如果 则conds
返回 元素,否则返回 元素。df
True
NaN
或者,更简单的是,使用 pandas
where
,正如@mozway 在下面的评论中所建议的那样(谢谢!):输出: