![](/img/trans.png)
[英]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.