Python数据争用:遍历DataFrame中的值并检查当前迭代器是否与表单匹配

2024-10-03 04:38:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我被困在一个数据争论的问题上。以下是我的数据:

Year = ['2010','2011','2012','2013','2014','2015','2010','2011','2014','2015','2016','2010','2011','2012','2015']
Type = ['WAS','WAS','BOS','BOS','WAS','BOS','BOS','BOS','WAS','WAS','BOS','BOS','BOS','BOS','BOS']
ID = ['a','a','a','a','a','a','b','b','b','b','b','c','c','c','c']
df = pd.DataFrame({'ID': ID,'Type': Type,'Year': Year})

df
a    WAS    2010
a    WAS    2011
a    BOS    2012
a    BOS    2013
a    WAS    2014
and so on...............

我正在努力完成两件事。。。 首先-我想循环遍历dataframe,对于每一行,检查id是否相同,并确定前一个类型是否与当前迭代器类型匹配。然后,创建两个新的二进制变量“WAStoBOS”和“BOStoWAS”,如果没有任何更改或更改与变量名不同,则返回0;如果更改与变量名方向一致,则返回1。你知道吗

例如,输出为:

df
ID   Type   Year  WAStoBOS BOStoWAS
a    WAS    2010    0    0
a    WAS    2011    0    0
a    BOS    2012    1    0
a    BOS    2013    0    0
a    WAS    2014    0    1
a    BOS    2015    1    0

第二: 在同一构造中,按ID查找当前行与上一行之间的差异。你知道吗

数据帧的最终结果是:

    df
ID   Type   Year  WAStoBOS BOStoWAS YearDiff
a    WAS    2010    0    0    0
a    WAS    2011    0    0    1
a    BOS    2012    1    0    1
a    BOS    2013    0    0    1
a    WAS    2014    0    1    1
a    BOS    2015    1    0    1
b    BOS    2010    0    0    0
b    BOS    2011    0    0    1
b    WAS    2014    0    1    3
b    WAS    2015    0    0    1
b    BOS    2016    1    0    1
c    BOS    2010    0    0    0
c    BOS    2011    0    0    1
c    BOS    2012    0    0    1
c    BOS    2015    0    0    3

任何帮助都将不胜感激。你知道吗


这个编辑是根据斯科茨的建议。你知道吗

例如,代码错误地将1分配给ID和类型更改的实例。如果一个ID改变了,我们不在乎以前的类型是什么。。。我将稍微更改下面的数据框,以说明ID和类型的更改,同时也显示所需的输出应该是什么。。。你知道吗

        df
ID   Type   Year  WAStoBOS BOStoWAS YearDiff
a    WAS    2010    0    0    0
a    WAS    2011    0    0    1
a    BOS    2012    1    0    1
a    BOS    2013    0    0    1
a    WAS    2014    0    1    1
**a    BOS    2015**    1    0    1
**b    WAS    2010**    0    0    0
b    BOS    2011    1    0    1
b    WAS    2014    0    1    3
b    WAS    2015    0    0    1
**b    WAS    2016**    0    0    1
**c    BOS    2010**    0    0    0
c    BOS    2011    0    0    1
c    BOS    2012    0    0    1
c    BOS    2015    0    0    3

在ID和类型发生变化的实例旁边加上星号,以供参考。谢谢你的帮助,我从来没有想过要用assign。你知道吗


Tags: and数据实例id类型dataframedftype
1条回答
网友
1楼 · 发布于 2024-10-03 04:38:37

正在考虑使用“ID”编辑分配二进制文件:

df.assign(WAStoBOS=df.groupby('ID')['Type'].transform(lambda x: ((x == 'BOS') & (x.shift(1) == 'WAS')).astype(int)),
          BOStoWAS=df.groupby('ID')['Type'].transform(lambda x: ((x == 'WAS') & (x.shift(1) == 'BOS')).astype(int)),
          YearDiff=df.groupby('ID')['Year'].transform(lambda x: x.astype(int).diff().fillna(0)))

让我们用一句话来说明:

df.assign(WAStoBost=((df.Type == 'BOS') & (df.shift(1).Type == 'WAS')).astype(int),
          BOStoWAS=((df.Type=='WAS')&(df.shift(1).Type == 'BOS')).astype(int),
          YearDiff=df.groupby('ID')['Year'].transform(lambda x: x.astype(int).diff().fillna(0)))

输出:

   ID Type  Year  BOStoWAS  WAStoBost  YearDiff
0   a  WAS  2010         0          0       0.0
1   a  WAS  2011         0          0       1.0
2   a  BOS  2012         0          1       1.0
3   a  BOS  2013         0          0       1.0
4   a  WAS  2014         1          0       1.0
5   a  BOS  2015         0          1       1.0
6   b  BOS  2010         0          0       0.0
7   b  BOS  2011         0          0       1.0
8   b  WAS  2014         1          0       3.0
9   b  WAS  2015         0          0       1.0
10  b  BOS  2016         0          1       1.0
11  c  BOS  2010         0          0       0.0
12  c  BOS  2011         0          0       1.0
13  c  BOS  2012         0          0       1.0
14  c  BOS  2015         0          0       3.0

相关问题 更多 >