如何使用现有列的某些行在熊猫中创建新列?

数据挖掘 Python 熊猫
2022-02-24 03:25:21

我有一个这样的数据集在此处输入图像描述

我的愿望格式是这样的在此处输入图像描述

我尝试使用索引切片,例如 dll.loc[:4,'category'] = "CAPITAL FUND" dll.loc[5:10,'category'] = "BORROWING" 但这个想法是有风险的,所以有什么想法可以解决这?

1个回答

我建议尝试通过索引来完成,而不是迭代每一行并根据需要填补空白。解决方案是:

df['category'] = df.where(~df.id.isnull())['item'].ffill()

在这里,我分解了我的解决方案,以帮助您了解的工作原理。

想象一下您的数据框被称为df. 我创建了你的一个小版本,如下所示:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame.from_dict(
            {'id':   [1, None, None, 2, None, None, 3, None, None],
             'item': ['CAPITAL FUND', 'A', 'B', 'BORROWINGS', 'A', 'B', 'DEPOSITS', 'A', 'B']})

In [3]: df       # see what it looks like

Out[3]: 

 id          item   
0  1.0  CAPITAL FUND
1  NaN             A
2  NaN             B
3  2.0    BORROWINGS
4  NaN             A
5  NaN             B
6  3.0      DEPOSITS
7  NaN             A
8  NaN             B

我将数据框返回到id不为~的位置(反转isnull())。在生成的数据框中,我只取item列(使用[item]),然后使用该列中的前一个有效值填充缺失的空白。

In [4]: df['category'] = df.where(~df.id.isnull())['item'].ffill() 

In [5]: df
Out[5]: 
    id          item      category
0  1.0  CAPITAL FUND  CAPITAL FUND
1  NaN             A  CAPITAL FUND
2  NaN             B  CAPITAL FUND
3  2.0    BORROWINGS    BORROWINGS
4  NaN             A    BORROWINGS
5  NaN             B    BORROWINGS
6  3.0      DEPOSITS      DEPOSITS
7  NaN             A      DEPOSITS
8  NaN             B      DEPOSITS

诀窍是理解这部分:df.where(~df.id.isnull())['item']

它实际上返回了整个数据帧,其中的值为~df.id.isnull()is True然后只有item数据框。结果是这样的:

In [6]: df.where(~df.id.isnull())['item'] 
Out[6]: 
0    CAPITAL FUND
1             NaN
2             NaN
3      BORROWINGS
4             NaN
5             NaN
6        DEPOSITS
7             NaN
8             NaN

现在应该清楚为什么最终.ffill()会像我们想要的那样工作。它使用最后一个已知的有效值向前填充缺失值。