簡體   English   中英

如何根據列值在數據框單元格內附加字符串

[英]How to append strings inside dataframe cells based on column values

給定一個數據框:

import pandas as pd

df = pd.DataFrame(data= {'Col1': ['No', 'Yes', 'No', 'Maybe'], 'Col2': ['Yes', 'No', 'No', 'No'], 'Result': ''})

我想用一個列表填充Result ,該列表可能需要根據列值進行附加。 在這種情況下,參數將是:

如果值為 'Yes' 保留Result的當前值,如果值為 'Maybe' append 'Attention needed (insert column name)',如果值為 'No' append 'Failure (insert column name)'

想要的結果: 在此處輸入圖片說明

不是很漂亮,但您可以創建一個dict ,然后將stackmapgroupbyjoin聚合一起使用:

d = {'No': 'Failure', 'Maybe': 'Attention needed'}
s = df[['Col1', 'Col2']].stack().map(d).dropna()

df['Result'] = (s + ' ' + s.index.get_level_values(1)).groupby(level=0).agg(', '.join)

[出去]

    Col1 Col2                               Result
0     No  Yes                         Failure Col1
1    Yes   No                         Failure Col2
2     No   No           Failure Col1, Failure Col2
3  Maybe   No  Attention needed Col1, Failure Col2

使用lambda函數試試這個單行代碼:

df['Result'] = df[['Col1','Col2']].apply(lambda x: 'Failure Col1' if (x[0]=='No' and x[1]=='Yes') else ('Failure Col2' if (x[1]=='No' and x[0]=='Yes') else ('Failure Col1, Failure Col2' if (x[0]=='No' and x[1]=='No') else("Attention needed Col1, Failure Col2" if (x[0]=='Maybe' and x[1]=='No') else None))), axis=1)

輸出:


   Col1     Col2    Result
0   No      Yes     Failure Col1
1   Yes     No      Failure Col2
2   No      No      Failure Col1, Failure Col2
3   Maybe   No      Attention needed Col1, Failure Col2

您可以首先將結果列構造為一個 numpy 數組,同時遍歷數據框列並檢查值,然后您可以添加新的結果列並刪除舊的結果列。

構造一個字典來替換df值並使用*+構造一系列合適的消息字符串,最后將它們連接起來並賦值給df.Result

d = {'Yes': '', 'No': 'Failure ', 'Maybe': 'Attention needed '}
df1 = df[['Col1', 'Col2']]
df['Result'] = ((df1.replace(d) 
                + df1.ne('Yes').values * df1.columns.values).agg(','.join, axis=1)
                                                            .str.strip(','))

或者

df['Result'] = ((df1.replace(d) 
                + df1.ne('Yes').values * (df1.columns+',').values).sum(1)
                                                                  .str.strip(','))

Out[267]:
    Col1 Col2                              Result
0     No  Yes                        Failure Col1
1    Yes   No                        Failure Col2
2     No   No           Failure Col1,Failure Col2
3  Maybe   No  Attention needed Col1,Failure Col2

這里的細節

df1.replace(d) + df1.ne('Yes').values * df1.columns.values

Out[268]:
                    Col1          Col2
0           Failure Col1
1                         Failure Col2
2           Failure Col1  Failure Col2
3  Attention needed Col1  Failure Col2

((df1.replace(d) + df1.ne('Yes').values * df1.columns.values).agg(','.join, axis=1)
                                                             .str.strip(','))

Out[269]:
0                          Failure Col1
1                          Failure Col2
2             Failure Col1,Failure Col2
3    Attention needed Col1,Failure Col2
dtype: object

暫無
暫無

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

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