我有以下数据框,我想对它进行一些操作:
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
知道如何解决这个问题吗?
答案 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]