如何识别指定范围的列中的某些行?

我有一个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个项目.

点赞