python-3.x 在单列pandas中捕获多个列名作为值

irtuqstp  于 2023-06-25  发布在  Python
关注(0)|答案(1)|浏览(92)

我只是想捕获主题名称(列名)作为值在新列,在重新评估后学生分数有一些改进。
我有重新评估前的数据集:
| 姓名|类|考试|数学|物理学|化学|加入日期|结果|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 约翰|十年级|模型1|九十八|七十八|三十五|2000-01-15|失败|
| 鲍勃|06级|期中考试|六十五|五十二|九十二|2001-08-16|传球|
| 玫瑰|06级|模型2|九十一|七十|五十四个|2001-09-14|传球|
| 迈克尔|07级|模型1|十个|九十|四十五|2010-01-10 2010-01-10|失败|
现在我有了重新评估后的数据集,一些学生的分数有了一些改善,最近参加考试的其他学生的分数也有了新的数据,
| 姓名|类|考试|数学|物理学|化学|加入日期|结果|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 约翰|十年级|模型1|九十八|七十八|*八十七 | 2000-01-15|通过|
| 鲍勃|06级|期中考试|六十五|91号|九十二|2001-08-16|传球|
| 玫瑰|06级|模型2|九十一|七十|五十四个|2001-09-14|传球|
| 迈克尔|07级|模型1|一百| 九十|四十五|2001-01-10
|通过|
| 山姆|08级|期中考试|四十三|六十二|八十|2000-08-10|传球|
| 詹姆斯|十年级|模型|七十六|六十六|九十六|2000-09-07|传球|
| 亨利|09级|模型1|三十四|九十一|七十|2000-01-04|失败|
现在,我们需要将这两个数据集合并,并标记哪一行被更新,哪一列被更新,所以,合并的数据集看起来像这样,
| 姓名|类|考试|数学|物理学|化学|加入日期|结果|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 约翰|十年级|模型1|九十八|七十八|三十五|2000-01-15|失败|
| 鲍勃|06级|期中考试|六十五|五十二|九十二|2001-08-16|传球|
| 玫瑰|06级|模型2|九十一|七十|五十四个|2001-09-14|传球|
| 迈克尔|07级|模型1|十个|九十|四十五|2010-01-10 2010-01-10|失败|
| 约翰|十年级|模型1|九十八|七十八|*八十七 | 2000-01-15|通过|
| 鲍勃|06级|期中考试|六十五|91号|九十二|2001-08-16|传球|
| 玫瑰|06级|模型2|九十一|七十|五十四个|2001-09-14|传球|
| 迈克尔|07级|模型1|一百| 九十|四十五|2001-01-10
|通过|
| 山姆|08级|期中考试|四十三|六十二|八十|2000-08-10|传球|
| 詹姆斯|十年级|模型|七十六|六十六|九十六|2000-09-07|传球|
| 亨利|09级|模型1|三十四|九十一|七十|2000-01-04|失败|
现在,最终的输出应该是这样的,有2个新列,我能够消除重复并添加新列任何改进,但我在添加另一个新列改进的主题时卡住了

预期输出:

| 姓名|类|考试|数学|物理学|化学|任何改进|改良场|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 约翰|十年级|模型1|九十八|七十八|**八十七 *| 是的|化学、结果|
| 鲍勃|06级|期中考试|六十五|91号|九十二|是的|物理学|
| 玫瑰|06级|模型2|九十一|七十|五十四个|没有|无改善|
| 迈克尔|07级|模型1|一百| 九十|四十五|是的|数学,结果,加入日期|
| 山姆|08级|期中考试|四十三|六十二|八十|新条目|新条目|
| 詹姆斯|十年级|模型|七十六|六十六|九十六|新条目|新条目|
| 亨利|09级|模型1|三十四|九十一|七十|新条目|新条目|
下面是代码,我用的,

added primary key column by concatenating name, class, exam and secondary key column by concatenating maths,physics,chemistry.

dupedf = concatdf.loc[concatdf.duplicated(subset=['PrimaryKey', 'SecondaryKey'],keep=False)]

dupedf1 = concatdf.loc[concatdf.duplicated(subset=['PrimaryKey'],keep=False)]

for i,j in dupedf.iterrows():
    for k,l in dupedf1.iterrows():
        if l['PrimaryKey'] == j['PrimaryKey']:
            
            dupedf = dupedf.drop_duplicates(subset=['PrimaryKey','SecondaryKey'],keep='last')
            dupedf['any improvement'] = 'No'
            # dupedf['improved subject'] = ' '

        else:
            dupedf1 = dupedf1.drop_duplicates(subset=['SecondaryKey'],keep=False)
            
            dupedf1 = dupedf1.drop_duplicates(subset=['PrimaryKey'],keep='last')
            dupedf1['any improvement'] = 'Yes'
           # dupedf1['improved subject'] = 'column name'

在上面的代码中,我只迭代了在重新评估数据集前后存在的行。逐行迭代以填充2个新列**anyimprovement & improvedfield。*我能够实现任何improvement列,但我需要improvedfield列的帮助。

bzzcjhmw

bzzcjhmw1#

你不应该在iterrows中使用循环,而应该尝试使用向量代码。
假设df1df2为两个输入:

# define ID columns
cols = ['name', 'class', 'exam']

# ensure having dates (optional)
df1['joining date'] = pd.to_datetime(df1['joining date'])
df2['joining date'] = pd.to_datetime(df2['joining date'])

# comparing the values
tmp = (df1.assign(**{'new entry': False}).set_index(cols)
          .lt(df2.set_index(cols).assign(**{'new entry': True}))
          .eval('`new entry` = ~`new entry`') # reverse flag
      )

# producing output
out = (df2.merge(tmp.mul(tmp.columns).where(tmp).stack()  # identifying columns that changed
                    .groupby(level=cols).agg(','.join)
                    .rename('improvedfield'),
                 left_on=cols, right_index=True, how='left')
          # adding anyimprovement column from the NA or new entry status of improvedfield
          .assign(anyimprovement=lambda d: np.select([d['improvedfield'].eq('new entry'),
                                                      d['improvedfield'].notna()],
                                                     ['new entry', 'yes'], 'no'
                                                    ))
          .fillna({'improvedfield': 'no improvement'})
      )

输出:

name       class      exam  maths  physics  chemistry joining date result     improvedfield anyimprovement
0     John  Grade - 10   model 1     98       78         87   2000-01-15   pass  chemistry,result            yes
1      Bob  Grade - 06  mid term     65       91         92   2001-08-16   pass           physics            yes
2     Rose  Grade - 06   model 2     91       70         54   2001-09-14   pass    no improvement             no
3  Michael  Grade - 07   model 1    100       90         45   2001-01-10   pass      maths,result            yes
4      Sam  Grade - 08  mid term     43       62         80   2000-08-10   pass         new entry      new entry
5    James  Grade - 10   model `     76       66         96   2000-09-07   pass         new entry      new entry
6    Henry  Grade - 09   model 1     34       91         70   2000-01-04   fail         new entry      new entry

相关问题