最后匹配行Python Panda DataFrame的索引值

时间:2015-07-06 07:19:04

标签: python-3.x numpy pandas

我有一个数据框,其值在“第2列”中为0或1,在“第1列”中为0或1,我会以某种方式查找并追加列作为索引值的列Column1 = 1的最后一行,但仅适用于第2列= 1的行。这可能比阅读更容易看到:

Lines

这将导致此结果集:

d = {'C1' : pd.Series([1, 0, 1,0,0], index=[1,2,3,4,5]),'C2' : pd.Series([0, 0,0,1,1], index=[1,2,3,4,5])}
df = pd.DataFrame(d)
print(df)

   C1  C2 
1   1   0   
2   0   0   
3   1   0   
4   0   1  
5   0   1

#I've left out my attempts as they don't even get close
df['C3'] = IF C2 = 1: Call Function that gives Index Value of last place where C1 = 1 Else 0 End 

我试图获得一个函数来执行此操作,因为我的数据集中大约有2百万行,但只有~10k,其中C2 = 1。

提前感谢您的帮助,我真的很感激 - 我才开始 几个星期前用python编程。

1 个答案:

答案 0 :(得分:2)

不是那么直接,你必须做一些循环才能得到这个结果。这里的关键是fillna方法,它可以向前和向后填充。

通常情况下,pandas方法不止一件事,这使得很难弄清楚用什么方法。

让我来谈谈你的代码。

首先我们需要将C3设置为nan,否则我们以后不能使用fillna

然后我们将C3设置为index,但仅限于C1 == 1mask执行此操作)

在此之后,我们可以使用fillnamethod='ffill'来传播最后一次观察。

然后我们必须屏蔽C2 == 0所有的值,就像我们之前设置index一样,mask

df['C3'] = pd.np.nan
mask = df['C1'] == 1
df['C3'].loc[mask] = df.index[mask].copy()
df['C3'] = df['C3'].fillna(method='ffill')
mask = df['C2'] == 0
df['C3'].loc[mask] = 0
df

    C1  C2  C3
1   1   0   0
2   0   0   0
3   1   0   0
4   0   1   3
5   0   1   3

编辑:

在索引中添加了.copy(),否则我们会覆盖它并且索引会全部为零。