[英]Assign value in column based on string in another column
我有以下代碼:
df1=pd.DataFrame(columns=["col1"],data=(["SUPER_280"],["AASD"],
["AASD"],["SUPER_350"],["AASD"],["SUPER_150"],["AASD"],["AASD"]))
結果如下表
col1
0 SUPER_280
1 AASD
2 AASD
3 SUPER_350
4 AASD
5 SUPER_150
6 AASD
7 AASD
實際數據要長得多。
我想制作一個檢查 col1 中的字符串的腳本,如果它找到子字符串“SUPER”,則從字符串中取出最后三個字符並將它們分配到第二列中,直到下一個“SUPER”。 我想實現這一目標:
col1 col2
0 SUPER_280 280
1 AASD 280
2 AASD 280
3 SUPER_350 350
4 AASD 350
5 SUPER_150 150
6 AASD 150
7 AASD 150
````
Thanks in advance
我們可以使用Series.str.contains
檢查單詞SUPER
出現的位置,然后使用Series.str.contains
保留最后 3 個字符,並使用Series.where
填充其余字符:
df1['col2'] = df1['col1'].where(df1['col1'].str.contains('SUPER')).str[-3:].ffill()
我們還可以使用pd.to_numeric
with errors = 'coerce'
將最后 3 個字符轉換為數字,並使用Series.ffill
填充其余Series.ffill
df1['col2']=pd.to_numeric(df1['col1'].str[-3:],errors='coerce').ffill()
輸出
col1 col2
0 SUPER_280 280.0
1 AASD 280.0
2 AASD 280.0
3 SUPER_350 350.0
4 AASD 350.0
5 SUPER_150 150.0
6 AASD 150.0
7 AASD 150.0
我們可以使用str.split
+ Series.ffill
:
df1['col2'] = df1['col1'].str.split('_').str[1].ffill()
或者通過使用np.where
有條件地檢查col1
是否有SUPER
:
mask = df1['col1'].str.contains('SUPER')
df1 = df1.assign(col2 = np.where(mask, df1['col1'].str[-3:], np.NaN)).ffill()
col1 col2
0 SUPER_280 280
1 AASD 280
2 AASD 280
3 SUPER_350 350
4 AASD 350
5 SUPER_150 150
6 AASD 150
7 AASD 150
通過Series.str.contains
測試值SUPER
,通過索引獲取列的最后 3 個值,然后向前填充缺失值:
m = df1['col1'].str.contains('SUPER')
df1.loc[m, 'col2'] = df1.loc[m, 'col1'].str[-3:]
df1['col2'] = df1['col2'].ffill()
print (df1)
col1 col2
0 SUPER_280 280
1 AASD 280
2 AASD 280
3 SUPER_350 350
4 AASD 350
5 SUPER_150 150
6 AASD 150
7 AASD 150
它根據字符分離表達_
,取到最后元件並給它分配col2
如果是digit
,和受讓人None
給col2
如果不是。 然后,根據之前的值填充ffill
。
>>> import pandas as pd
df1=pd.DataFrame(columns=["col1"],data=(["SUPER_280"],["AASD"],
>>> ... ["AASD"],["SUPER_350"],["AASD"],["SUPER_150"],["AASD"],["AASD"]))
>>> df1
col1
0 SUPER_280
1 AASD
2 AASD
3 SUPER_350
4 AASD
5 SUPER_150
6 AASD
7 AASD
>>> df1['col2'] = df1['col1'].apply(lambda x: x.split('_')[-1] if x.split('_')[-1].isdigit() else None).ffill()
>>> df1
col1 col2
0 SUPER_280 280
1 AASD 280
2 AASD 280
3 SUPER_350 350
4 AASD 350
5 SUPER_150 150
6 AASD 150
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.