使用Pandas循环根据两列中的条件组合创建新的数据帧

2024-09-30 18:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

对Python/Pandas还很陌生,并且尝试在iPython笔记本的python3中对我的数据帧执行操作。在

我有一个测向仪:

df=    Building ID   CorporationName  IndividualName
       1             Sample, LLC      John 
       1             n/a              Sam 
       1             n/a              Nancy 
       2             n/a              Tim
       2             n/a              Larry
       2             n/a              Paul 
       3             n/a              Rachel 
       4             Sample1, LLC     Dan 

我想创建一个新的dataframe,只对CorporationName下所有匹配的BuildingID值使用“n/a”作为值的行。通常,这很容易,但在本例中,我们有重复的BuildingID值,即使整行不是重复的。所以理想情况下,我们的输出如下:

^{pr2}$

我的第一个想法是:

nocorp = ownercombo[ownercombo.CorporationName == 'n/a']

但显然,对于某些与BuildingID相关的条目,这将返回“n/a”的行,而不是全部。在

说实话,我真的不知道该怎么做。我建议用我能找到的最接近的帖子。但是,我意识到如果我这样做,它只会返回四个布尔值:

In:    morethanone = ownercombo.groupby((ownercombo['BuildingID'].value_counts() > 1))
Out:                CorporationName

        BuildingID  
             False    True
             True     True

我显然没有任何地方接近正确的轨道,所以任何帮助我指出正确的方向将不胜感激!在


Tags: 数据idtruepandasdfipython笔记本python3
2条回答

您可以使用groupby/filter

In [118]: df.groupby('Building ID').filter(lambda x: (x['CorporationName']=='n/a').all())
Out[118]: 
   Building ID CorporationName IndividualName
3            2             n/a            Tim
4            2             n/a          Larry
5            2             n/a           Paul
6            3             n/a         Rachel

首先可以找到列CorporationName^{}值,而不是(~^{}字符串{}。然后可以使用^{}按掩码过滤{}:

uni= ownercombo.loc[~ownercombo.CorporationName.str.contains('n/a'), 'Building ID'].unique()
print uni
[1 4]
print ownercombo[~ownercombo['Building ID'].isin(uni)]
   Building ID CorporationName IndividualName
3            2             n/a            Tim
4            2             n/a          Larry
5            2             n/a           Paul
6            3             n/a         Rachel

相关问题 更多 >