簡體   English   中英

有條件地用另一個字符串替換熊貓系列中的字符串

[英]conditionally Replace string in a Pandas series with another string

請看下面的例子。 要在一個特定的列中替換一個字符串,我已經做到了,它可以正常工作:

df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'data1': range(6),
                   'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1']},
                   columns = ['key', 'data1', 'data2'])

  key  data1 data2
0   A      0    A1
1   B      1    B1
2   C      2    C1
3   A      3    A1
4   B      4    B1
5   C      5    C1



df['data2']= df['data2'].str.strip().str.replace("A1","Bad")

  key  data1 data2
0   A      0    Bad
1   B      1    B1
2   C      2    C1
3   A      3    Bad
4   B      4    B1
5   C      5    C1

Q(1)如何有條件地替換一個字符串? 就是說,在data2列中,我只想替換A1data2 if "key==A" and "data1">1 我怎樣才能做到這一點?

Q(2)是否可以將條件替換應用於多次替換(即,用“不良”同時替換A1 and A2 ,但只能在相似的條件下進行替換)?

您可以使用numpy和基於regex的替換來覆蓋A1, A2等。 如果我們將您的數據擴展為包括A3的示例:

import pandas as pd
import numpy as np

df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C', 'A'],
                   'data1': range(7),
                   'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1', 'A3']},
                   columns=['key', 'data1', 'data2'])

df['data2'] = np.where((df['key'] == 'A') & (df['data1'] > 1),
                       df['data2'].str.replace(r'A\d+','Bad'),
                       df['data2'])

返回:

  key  data1 data2
0   A      0    A1
1   B      1    B1
2   C      2    C1
3   A      3   Bad
4   B      4    B1
5   C      5    C1
6   A      6   Bad

我認為兩面都需要過濾器列,僅替換過濾的行:

mask = (df['key']=="A") &  (df['data1'] > 1)
df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace("A1","Bad")  

print (df)
  key  data1 data2
0   A      0    A1
1   B      1    B1
2   C      2    C1
3   A      3   Bad
4   B      4    B1
5   C      5    C1

如果需要多次替換,請使用dict replace

df = pd.DataFrame({'key': ['A', 'A', 'C', 'A', 'B', 'C'],
                   'data1': range(6),
                   'data2': ['A1', 'A2', 'C1', 'A1', 'B1', 'C1']},
                   columns = ['key', 'data1', 'data2'])

mask = (df['key']=="A") &  (df['data1'] > 0)
df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().replace({"A1":"Bad", "A2":'Bad1'})  

或使用正則表達式:

df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace(r'^A.*',"Bad")


print (df)
  key  data1 data2
0   A      0    A1
1   A      1  Bad1
2   C      2    C1
3   A      3   Bad
4   B      4    B1
5   C      5    C1

如果我們要通過以下方式擴展上面的示例:

df = pd.DataFrame({'key': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'data1': range(6),
                   'data2': ['A1', 'B1', 'C1', 'A1', 'B1', 'C1']},
                   columns = ['key', 'data1', 'data2'])  

mask = (df['data1'] > 1)
df.loc[mask, 'data2']= df.loc[mask, 'data2'].str.strip().str.replace("A1",df['key']) 

  key  data1 data2
0   A      0    A1
1   B      1    B1
2   C      2   NaN
3   A      3   NaN
4   B      4   NaN
5   C      5   NaN

我以為data2的內容將被列“ key”的內容(在data1> 1的條件下)代替的答案讓我感到非常驚訝。 任何想法?

暫無
暫無

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

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