我有一个df,我需要在列表中找到任何具有值的行,这些行也位于另一个列表中.
对于此示例,我需要在以“Month”开头的任何列中标识具有值J,Q,R的任何行.
如果列中的任何一个字母存在,则最终的df将有一个显示true或false的列.
df = pd.DataFrame({'KEY': ['1312', '1345', '5555', '5555','5555'],
'Month1': [1, 1, 1,1,1],
'Month2': [1, 1, 'J',1,1],
'Month3': [1, 1, 1,1,1],
'Month4': [1, 'J', 1,1,1],
'Month5': [1, 1, 1,0,0],
'Month6': [1, 1, 1,0,0],
'Date1': [20120304, 20120102, 20120203,20120402,4],
'Date2': [20120405,20120104,20120502,20120501,4],
'StartMonth': [3,1,1,4,3],
'EndMonth': [4,1,3,5,5],
'ID': [1,2,3,3,4]})
df[['KEY','ID','Date1','Date2','StartMonth','EndMonth','Month1', 'Month2','Month3','Month4','Month5','Month6']]
预期结果:
Date1 Date2 EndMonth ID KEY Month1 Month2 Month3 Month4 Month5 Month6 StartMonth HemoFacB
0 20120304 20120405 4 1 1312 1 1 1 1 1 1 3 False
1 20120102 20120104 1 2 1345 1 1 1 J 1 1 1 True
2 20120203 20120502 3 3 5555 1 J 1 1 1 1 1 True
3 20120402 20120501 5 3 5555 1 1 1 1 0 0 4 False
4 4 4 5 4 5555 1 1 1 1 0 0 3 False
我的初步尝试导致以下错误:
codes = ['J','Q','R']
cols = [col for col in df if col.startswith(('Month'))]
df['HemoFacB'] = np.where(df[cols].isin(codes),1,0)
ValueError: Wrong number of items passed 6, placement implies 1
最佳答案 我忘了添加.any().
以下代码有效.
df['HemoFacB'] = np.where(df[cols].isin(codes),1,0).any(1)
该错误表明我试图将太多(6个cols)项目比较为1个结果.通过使用.any()
,如果任何迭代(cols)=’True’,则此函数返回’True’,如果iterable返回全部’False’,则返回false,最终将项目数减少到1.所以通过添加.any( 1)到最后,脚本合并了传递给1项的6个项目.