簡體   English   中英

根據另一列中的字符串在列中分配值

[英]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 ,和受讓人Nonecol2如果不是。 然后,根據之前的值填充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.

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