簡體   English   中英

Select 行按列值並按另一個列值包含前一行

[英]Select rows by column value and include previous row by another column value

這是 DataFrame 的示例:

import numpy as np
import pandas as pd

df = pd.DataFrame([
    [0, "file_0", 5],
    [0, "file_1", 0],
    [1, "file_2", 0],
    [1, "file_3", 8],
    [2, "file_4", 0],
    [2, "file_5", 5],
    [2, "file_6", 100],
    [2, "file_7", 0],
    [2, "file_8", 50]
], columns=["case", "filename", "num"])

我想要 select num==0行及其前一行具有相同的case值,無論前一行的num值如何。

最后,我們應該得到

case    filename    num
0   file_0  5
0   file_1  0
1   file_2  0
2   file_4  0
2   file_6  100
2   file_7  0

我知道我可以 select 前一行

df[(df['num']==0).shift(-1).fillna(False)]

但是,這不考慮case值。 我想到的一個解決方案是先按case分組,然后過濾數據。 我不知道如何編碼...

我自己想出答案:

# create boolean masks which are true when `num` is 0 and previous `case` is the same
mask = (df.case.eq(df.case.shift())) & (df['num']==0)

# concat previous rows and num==0 rows
df_res = pd.concat([df[mask.shift(-1).fillna(False)], df[df['num']==0]]).sort_values(['case', 'filename'])

你的意思是:

df.join(df.groupby('case').shift(-1)
                .loc[df['num']==0]
                .dropna(how='all').add_suffix('_next'), 
        how='inner')

Output:

   case filename  num filename_next  num_next
0     0   file_0    0        file_1       0.0
3     2   file_3    0        file_4     100.0
5     2   file_5    0        file_6      50.0

合並df怎么樣?

    df = pd.DataFrame([
    [0, "file_0", 0],
    [0, "file_1", 0],
    [1, "file_2", 0],
    [2, "file_3", 0],
    [2, "file_4", 100],
    [2, "file_5", 0],
    [2, "file_6", 50],
    [2, "file_7", 0]
], columns=["case", "filename", "num"])
df = df.merge(df, left_on='filename', right_on='filename', how='inner')
df[(df['case_x'] == df['case_y']) & df['num_x'] == 0]
Out[219]: 
   case_x filename  num_x  case_y  num_y
0       0   file_0      0       0      0
1       0   file_1      0       0      0
2       1   file_2      0       1      0
3       2   file_3      0       2      0
4       2   file_4    100       2    100
5       2   file_5      0       2      0
6       2   file_6     50       2     50
7       2   file_7      0       2      0

然后你可以重命名列

df[['case_x', 'filename',  'num_x']].rename({'case_x':'case','num_x':'num'},axis=1)
Out[223]: 
   case filename  num
0     0   file_0    0
1     0   file_1    0
2     1   file_2    0
3     2   file_3    0
4     2   file_4  100
5     2   file_5    0
6     2   file_6   50
7     2   file_7    0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM