我有一个数据框,其值在“第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编程。
答案 0 :(得分:2)
不是那么直接,你必须做一些循环才能得到这个结果。这里的关键是fillna方法,它可以向前和向后填充。
通常情况下,pandas方法不止一件事,这使得很难弄清楚用什么方法。
让我来谈谈你的代码。
首先我们需要将C3
设置为nan,否则我们以后不能使用fillna
。
然后我们将C3
设置为index
,但仅限于C1 == 1
(mask
执行此操作)
在此之后,我们可以使用fillna
和method='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()
,否则我们会覆盖它并且索引会全部为零。