[英]How to append a column to a dataframe with values based on condition
[英]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
,然后將stack
、 map
和groupby
與join
聚合一起使用:
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.