如何检查列中的值是否存在于以下行中?

时间:2016-08-02 18:56:38

标签: python pandas indexing dataframe

我有以下数据框,我想对它进行一些操作:

   AutoStudyID   DiagDate  DiagName
0           34 2010-09-23      Lung
1           34 2001-01-01      Skin
2           48 2008-01-01     Brain

如何使用pandas的力量来检查下一行中AutoStudyID直接跟随AutoStudyID的情况?

例如,如下面两行:

0           34 2010-09-23      Lung
1           34 2001-01-01      Skin

我的最终目标是使数据帧每行只有一个唯一的AutoStudyID。微妙的AutoStudyID的数据应该通过创建新列合并为唯一的,输出应该是这样的:

   AutoStudyID   DiagDate  DiagName    DiagDate2    DiageName2
0           34 2010-09-23      Lung   2001-01-01          Skin
1           48 2008-01-01     Brain

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

以下将检查下一行(对于数字和日期时间dtypes)的值是否相同?

In [203]: df.AutoStudyID.diff() == 0
Out[203]:
0    False
1     True
2    False
Name: AutoStudyID, dtype: bool

In [204]: df[df.AutoStudyID.diff() == 0]
Out[204]:
   AutoStudyID    DiagDate DiagName
1           34  2001-01-01     Skin

或更通用的方式(它也适用于strings):

In [206]: df.AutoStudyID.shift() == df.AutoStudyID
Out[206]:
0    False
1     True
2    False
Name: AutoStudyID, dtype: bool

答案 1 :(得分:1)

尝试使用以下AutoStudyID添加新列:

df['next'] = df.AutoStudyID.shift(-1)
df

    AutoStudyID DiagDate    DiagName    next
0   34          2010-09-23  Lung        34
1   34          2001-01-01  Skin        48
2   48          2008-01-01  Brain       NaN

每行也会有下一个ID。行应按AutoStudyID排序。

您也可以尝试按AutoStudyID进行分组:

df.groupby('AutoStudyID')

例如:

for group in df.groupby('AutoStudyID'):
    print(group)

你得到这些小组,你可以做你需要的:

('34',   AutoStudyID    DiagDate DiagName next
0          34  2010-09-23     Lung   34
1          34  2001-01-01     Skin   48)
('48',   AutoStudyID    DiagDate DiagName next
2          48  2008-01-01    Brain  NaN)

答案 2 :(得分:0)

使用iterrows()迭代行,并将字段AutoStudyID与找到的最后一个值进行比较。

last = None
for i, row in df.iterrows():
    if last == df['AutoStudyID'][i]:
        print('I found it in position: %s' % i)
    else:
        last = df['AutoStudyID'][i]