pandas 在Python中循环遍历行和多列

epggiuax  于 2023-03-06  发布在  Python
关注(0)|答案(2)|浏览(162)

我在Python中有一个数据框,看起来像这样:
| 识别号|日期|数值1|数值2|
| - ------|- ------|- ------|- ------|
| 小行星123|二○二三年一月|三十二|二十一|
| 小行星123|二○二三年一月|五十四|四十三|
| 小行星13459|二○二○年十月二日|十九|五十八|
| 小行星13459|二○二○年十月二日|十九|八十五|
| 小行星13459|二○二○年十月二日|十九|三十四|
| 小行星123|二○一七年六月四日|五十四|二十二|
| 小行星123|二○一七年六月四日|三十三|三十一|
我想创建一个名为“indicator”的新列,它将具有二进制值- 1或:如果同一个人在同一天具有相同的值“值1”(或“值2”),则为1。因此,例如,由于“Value_1”在2020年10月2日为19,因此人员13459的值为1。它应如下所示:
| 识别号|日期|数值1|数值2|指标|
| - ------|- ------|- ------|- ------|- ------|
| 小行星123|二○二三年一月|三十二|二十一|无|
| 小行星123|二○二三年一月|五十四|四十三|无|
| 小行星13459|二○二○年十月二日|十九|五十八。|1个|
| 小行星13459|二○二○年十月二日|十九|八十五|1个|
| 小行星13459|二○二○年十月二日|十九|三十四|1个|
| 小行星123|二○一七年六月四日|五十四|二十二|1个|
| 小行星123|二○一七年六月四日|三十三|二十二|1个|
问题是同一个人多次填写问卷,即在多个日期填写问卷,我想看看哪个人在一年中的同一天有相同的答案。
我正在和Pandas一起工作。谢谢!

plupiseo

plupiseo1#

ID, Date分组,检查每组中Value 1Value 2是否具有相同的值:

g = df.groupby(['ID', 'Date'])
df['indicator'] = (g['Value 1'].transform(lambda x: x.nunique() == 1)
                   | g['Value 2'].transform(lambda x: x.nunique() == 1)).astype(int)
ID        Date  Value 1  Value 2  indicator
0  12345   1.1.2023        32       21          0
1  12345   1.1.2023        54       43          0
2  13459  2.10.2020        19       58          1
3  13459  2.10.2020        19       85          1
4  13459  2.10.2020        19       34          1
5  12345   4.6.2017        54       22          0
6  12345   4.6.2017        33       31          0
xwbd5t1u

xwbd5t1u2#

另一种方法是使用meltmerge,这将允许您在多个列上运行此操作。

s = pd.melt(df,id_vars=['ID','Date'])

s['indicator'] = (
       s.groupby(['ID','Date','value'])['value']\
            .transform('size') > 1).astype(int)
       )

df_out = pd.merge(df,s.drop_duplicates(
          subset=['ID','Date']
           ).drop(['value','variable'],axis=1)
          ,on=['Date','ID'],how='left')

打印(df_out)

ID       Date  Value 1  Value 2  indicator
0  12345   1.1.2023       32       21          0
1  12345   1.1.2023       54       43          0
2  13459  2.10.2020       19       58          1
3  13459  2.10.2020       19       85          1
4  13459  2.10.2020       19       34          1
5  12345   4.6.2017       54       22          0
6  12345   4.6.2017       33       31          0

相关问题