这是我的数据框:
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,则输出应为CUSTOM1
,CUSTOM2
和CUSTOM3
。
感谢。
答案 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