如何使用现有列的某些行在熊猫中创建新列?
数据挖掘
Python
熊猫
2022-02-24 03:25:21
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()会像我们想要的那样工作。它使用最后一个已知的有效值向前填充缺失值。
其它你可能感兴趣的问题

