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

时间:2018-02-23 16:56:17

标签: python pandas

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

2 个答案:

答案 0 :(得分:6)

我忘记添加.any()

以下代码有效。

df['HemoFacB'] = np.where(df[cols].isin(codes),1,0).any(1)

错误表明我试图将太多(6个cols)项目比较为1个结果。使用.any(),此函数返回' True'如果任何iterables(cols)=' True',如果iterable返回all' False'则为false,最终将项目数减少到1.所以通过添加{{1最后,脚本合并了传递给1个项目的6个项目。

答案 1 :(得分:1)

这是一个不使用numpy的解决方案。我没有使用所有的字段,但我相信你会理解它。另外,我在操作字典后最后使用了DataFrame。我觉得这样做要容易得多。

import pandas as pd

mydict = {'KEY': ['1312', '1345', '5555', '5555','5555'], 'Month1': [1, 'J', 3,4,'J']}

#print(df)

truth_list = []
for val in zip(*mydict.values()):
    #print(val)
    #print("This is key: {} and value: {}".format(key, val))
    if 'J' in val:
        #print("True")
       truth_list.append('True')
    else:
        #print("False")
        truth_list.append('False')
    #print("Row {}".format(row = row + 1))

mydict.update({'HemoFacB': truth_list})

df = pd.DataFrame(mydict)
print(df)