首页 > 解决方案 > 大熊猫抓取价值以填充新列

问题描述

如果一天的“A”大于前一天的“A”,我正在尝试获取具有条件 B 值的新列 B 和 C。否则,该值将为负数(C 列)。

这是我想要得到的一个例子:

    A         B         C
0.  167765   
1.  235353    235353
2.   89260     89260
3.  188382    188382
4.  104677              104677
5.  207723              207723

我注意到这会导致索引错误,因为 B 列和 C 列中的数据数将与原始 A 列不同。

目前,我正在通过这个测试将特定数据移动到 B 列,这导致值的长度与索引错误的长度不匹配:

df['B'] = np.where(df['A'] <= 250000)

如何在第一行为 NA 或为空的情况下完成所需的输出?

所需的输出

    B          C
0.     
1.  235353
2.   89260
3.  188382
4.             104677
5.             207723

标签: pythonpandas

解决方案


我无法理解您如何通过您描述的方法获得最终结果

据我了解,如果值大于前一天的值,则应将值放在 B 列中。否则在 C 列。

如果您的意思不同,您可能需要纠正我或调整此答案。

诀窍在于在.wherepandasSeries对象上使用,它会自动插入NaNs。

df = pd.DataFrame({'A': [167765, 235353, 89260, 188382, 104677, 207723]})

diffs = df['A'].diff()

df['B'] = df['A'].where(diffs >= 0)
df['C'] = df['A'].where(diffs < 0)

diffs将是以下内容,第一行Series也有一个方便的。NaN

0         NaN
1     67588.0
2   -146093.0
3     99122.0
4    -83705.0
5    103046.0
Name: A, dtype: float64

NaN总是返回比较False。因此,我们可以通过分别比较正负来省略第一行。

结果表如下所示

        A         B         C
0  167765       NaN       NaN
1  235353  235353.0       NaN
2   89260       NaN   89260.0
3  188382  188382.0       NaN
4  104677       NaN  104677.0
5  207723  207723.0       NaN

推荐阅读