使用数据框架pandas中的值选择列

时间:2018-02-19 01:33:24

标签: python pandas pandas-groupby

编辑:我提供了更多关于这个问题的背景知识,以帮助澄清。

我最初开始时使用的是具有“键”的df'每个月标记为第1个月到第12个月。在给定密钥和月份的每个单元格中,有1或0表示患者('密钥')在该月内是否有保险,(1 = True,0 = False) 。在另一个df我有大约105列,其中包括一个' Key'和'日期1'和'日期2'。我的目标是找到在提供的日期(包括)之间有保险范围的行。我特意想要那些行。需要注意的是,如果给定患者的任何行('键')没有提供所提供日期的保险(以及日期之间的时间),那么我想要删除该患者的所有行。

所以最初,我将两个数据帧合并在一起,并创建了另外两个包含StartMonth和EndMonth的列,这些列分别派生自date1和date2。我现在需要检查患者在这段时间内是否有保险。

例如,在下面的数据框中有12个月中的6个(所以它不是太大)。第一行将被删除,因为患者在StartMonth和EndMonth之间没有保险。第二行将保留,因为在他们的StartMonth和EndMonth期间有保险。第3行和第4行将被删除,因为即使第3行确实对日期有保险,第4行也没有,所以患者的所有行('键')都将被删除。

df = pd.DataFrame({'KEY': ['1312', '1345', '5555', '5555'], 
              'Month1': [1, 1, 1,1],
              'Month2': [1, 1, 1,1],
              'Month3': [0, 1, 1,1],
              'Month4': [0, 1, 0,0],
              'Month5': [0, 1, 0,0],
              'Month6': [0, 1, 0,0],
              'Date1': [20120304, 20120102, 20120203,20120402],
              'Date2': [20120405,20120104,20120502,20120501],
              'StartMonth': [3,1,1,4],
              'EndMonth': [4,1,3,5]})
df[['KEY','Date1','Date2','StartMonth','EndMonth','Month1', 'Month2','Month3','Month4','Month5','Month6']]

原始数据框:

    KEY     Date1       Date2       StartMonth  EndMonth    Month1  Month2  Month3  Month4  Month5  Month6
0   1312    20120304    20120405    3           4           1       1       0       0       0       0
1   1345    20120102    20120104    1           1           1       1       1       1       1       1
2   5555    20120203    20120502    1           3           1       1       1       0       0       0
3   5555    20120402    20120501    4           5           1       1       1       0       0       0

最终结果:

    KEY     Date1       Date2       StartMonth  EndMonth    Month1  Month2  Month3  Month4  Month5  Month6
1   1345    20120102    20120104    1           1           1       1       1       1       1       1

我最初的方法是通过连接“月”字来找到我需要的列。使用在StartMonth和EndMonth中找到的值。在这样做之后,我认为我可以为保险时间框架创建边界,但是,我在这种方法中遇到了错误。我很早就在这个过程中,但我认为这可能不是最好的方法。任何帮助都会很棒,这是一个棘手的问题。

df.groupby('KEY').filter(lambda x: x['Month'+ x.iloc[x]['StartMonth']]==1.0)

IndexError: positional indexers are out-of-bounds

我正在研究的另一种方法是创建一个列名列表,我为每行的startmonth和endmonnth派生这些列名。然后我想我可以将这些列名包含到.filter()中,看看列的范围是否为0。

MonthRange = []
StartMonthStr = []
EndMonthStr = []
StartMonthInt = df['StartMonth'].tolist()
EndMonthInt = df['EndMonth'].tolist()

for x,y in zip(StartMonthInt, EndMonthInt):
    sm = 'Month' + str(x)
    em = 'Month' + str(y)
    diff = y - x
    MonthRange.append(diff)
    StartMonthStr.append(sm)
    EndMonthStr.append(em)

2 个答案:

答案 0 :(得分:1)

这可能是你想要的。

def condition(row):
    return row['KEY'] if not all(row['Month'+str(i)] \
           for i in range(row['aStartMonth'], row['aEndMonth']+1)) else None

df = df[~df['KEY'].isin(df.apply(condition, axis=1))]

#       Date1     Date2        KEY  Month1  Month2  Month3  Month4  Month5  \
# 0  20120304  20120405  100000003       1       1       1       1       1   

#    Month6  aEndMonth  aStartMonth  
# 0       1          4            3 

答案 1 :(得分:0)

首先定义一个检查逻辑的函数:

multiplySquare

然后将此功能应用于每个组并过滤数据:

n