【问题标题】:Index Value of Last Matching Row Python Panda DataFrame最后匹配行 Python Panda DataFrame 的索引值
【发布时间】:2015-07-06 07:19:03
【问题描述】:

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

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 

这将产生这个结果集:

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

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

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

【问题讨论】:

    标签: python-3.x numpy pandas


    【解决方案1】:

    这不是那么简单,你必须做几个循环才能得到这个结果。这里的关键是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(),否则我们会覆盖它并且索引将全为零。

    【讨论】:

    • 这行得通,非常感谢!虽然为什么掩码索引只在真实的地方? df.index[mask] = Int64Index([1, 3], dtype='int64')
    • @SomeGuy30145 我也看到了这个错误并添加了修复程序(请参阅我帖子底部的编辑)。这是因为在之前版本的代码中,我将 C3 设置为 be 索引,然后我修改了 C3(因此也修改了索引)。在现在发布的版本中,我通过在 C3 列的分配中添加 .copy() 来解决此问题,这解决了问题
    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多