繁体   English   中英

Pandas 替换连续组中除第一个以外的所有内容

[英]Pandas replace all but first in consecutive group

问题描述很简单,但我不知道如何在 Pandas 中进行这项工作。 基本上,我试图用一些替换值替换连续值(第一个值除外)。 例如:

data = {
    "A": [0, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 3]
}

df = pd.DataFrame.from_dict(data)


    A
0   0
1   1
2   1
3   1
4   0
5   0
6   0
7   0
8   2
9   2
10  2
11  2
12  3

如果我通过一些 function foo(df, 2, 0)运行它,我会得到以下信息:

    A
0   0
1   1
2   1
3   1
4   0
5   0
6   0
7   0
8   2
9   0
10  0
11  0
12  3

它将2的所有值替换为0 ,除了第一个值。 这可能吗?

您可以找到A = 2A也等于前A值的所有行,并将它们设置为 0:

data = {
    "A": [0, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 3]
}

df = pd.DataFrame.from_dict(data)
df[(df.A == 2) & (df.A == df.A.shift(1))] = 0

Output:

    A
0   0
1   1
2   1
3   1
4   0
5   0
6   0
7   0
8   2
9   0
10  0
11  0
12  3

如果 dataframe 中有多个列,请使用df.loc设置A值:

df.loc[(df.A == 2) & (df.A == df.A.shift(1)), 'A'] = 0

尝试,如果“A”在数据名中进一步复制,则 an 是单调递增的:

def foo(df, val=2, repl=0):
  return df.mask((df.groupby('A').transform('cumcount') > 0) & (df['A'] == val), repl)

foo(df, 2, 0)

Output:

    A
0   0
1   1
2   1
3   1
4   0
5   0
6   0
7   0
8   2
9   0
10  0
11  0
12  3

我不确定这是否是最好的方法,但我想出了这个解决方案,希望对您有所帮助:

import pandas as pd
data = {
    "A": [0, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 3]
}

df = pd.DataFrame(data)
def replecate(df, number, replacement):
    i = 1 
    for column in df.columns:
        for index,value in enumerate(df[column]):
            if i == 1 and value == number :
                i = 0
            elif value == number and i != 1:
                df[column][index] = replacement
        i = 1
    return df 

replecate(df, 2 , 0)

Output

    A
0   0
1   1
2   1
3   1
4   0
5   0
6   0
7   0
8   2
9   0
10  0
11  0
12  3

我已经通过将行向下移动一位并检查值是否对齐来解决这个问题。 还包括一个 function 可以接受多个值来检查(不仅仅是 2 个)。

import pandas as pd
data = {
    "A": [0, 1, 1, 1, 0, 0, 0, 0, 2, 2, 2, 2, 3]
}

df = pd.DataFrame(data)
def replace_recurring(df,key,offset=1,values=[2]): 
    df['offset'] = df[key].shift(offset) 
    df.loc[(df[key]==df['offset']) & (df[key].isin(values)),key] = 0 
    df = df.drop(['offset'],axis=1) 
    return df 
df = replace_recurring(df,'A',offset=1,values=[2])

给 output:

    A
0   0
1   1
2   1
3   1
4   0
5   0
6   0
7   0
8   2
9   0
10  0
11  0
12  3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM