根据条件更改数据框中的值

时间:2018-01-05 22:38:08

标签: python pandas dataframe

这是我的数据框:

import pandas as pd
list = ['RK','G', 'CUSTOM', 'CUSTOM', 'KL', 'kj']
df=pd.DataFrame(list,columns=['A'])

我想在此处查找列A中等于CUSTOM的所有条目,并将其替换为CUSTOM1 AND CUSTOM2。< / p>

输出应为:

       A
0      RK
1      G
2    CUSTOM1
3    CUSTOM2
4     KL
5     kj

如果有3 CUSTOM而不是2,则输出应为CUSTOM1CUSTOM2CUSTOM3

感谢。

4 个答案:

答案 0 :(得分:2)

使用cumcount + count

df.A=df.A+(df.groupby('A').cumcount()+1).where(df.groupby('A').A.transform('count').ne(1),'').astype(str)
df.A
Out[208]: 
0         RK
1          G
2    CUSTOM1
3    CUSTOM2
4         KL
5         kj
dtype: object

答案 1 :(得分:2)

使用cumsum + np.where -

m = df.A.eq('CUSTOM')
df.A = np.where(m, df.A + m.cumsum().astype(str), df.A)

df
         A
0       RK
1        G
2  CUSTOM1
3  CUSTOM2
4       KL
5       kj

使用pd.Series.where / mask -

的类似解决方案
df.A = df.A.where(~m, df.A + m.cumsum().astype(str))

或者,

df.A = df.A.mask(m, df.A + m.cumsum().astype(str))

df
         A
0       RK
1        G
2  CUSTOM1
3  CUSTOM2
4       KL
5       kj

答案 2 :(得分:2)

我很想知道这种方法与其他方法相比如何运作:

In [10]: import itertools

In [11]: counter = itertools.count(1)

In [12]: df.A.str.replace(r"CUSTOM", lambda x: f"CUSTOM{next(counter)}")
Out[12]:
0         RK
1          G
2    CUSTOM1
3    CUSTOM2
4         KL
5         kj
Name: A, dtype: object

注意,pandas需要pd.Series.str.replace版本&gt; = 0.20.0才能接受可调用。

如果你没有Python 3.6 f-strings,你也可以这样做:

In [14]: counter = itertools.count(1)

In [15]: df.A.str.replace(r"CUSTOM", lambda x: "CUSTOM{}".format(next(counter)))
Out[15]:
0         RK
1          G
2    CUSTOM1
3    CUSTOM2
4         KL
5         kj
Name: A, dtype: object

答案 3 :(得分:1)

你可以用循环来做到这一点:

count = 1
for index, row in df.iterrows():
    if row['A'] == 'CUSTOM':
        row['A'] += str(count)
        count += 1

print(df)

#output
         A
0       RK
1        G
2  CUSTOM1
3  CUSTOM2
4       KL
5       kj