【问题标题】:overwriting cells from one pandas dataframe to another based on row values根据行值将单元格从一个熊猫数据帧覆盖到另一个数据帧
【发布时间】:2021-03-02 21:47:01
【问题描述】:

我有两个数据集(空白和填充),如下所示,我需要将信息从filled 复制到blank

blank.head()
| Student name  | Student number    | Mark      | Grade     | Marked by     | Notes     |
|-------------- |----------------   |--------   |--------   |-----------    |--------   |
| John          |16                 | NaN       | NaN       | NaN           | NaN   |
| Mary          |19                 | NaN       | NaN       | NaN           | NaN   |
| Colm          |17                 | NaN       | NaN       | NaN           | NaN   |
| Ellen         |20                 | NaN       | NaN       | NaN           | NaN   |
| Fionna        |21                 | NaN       | NaN       | NaN           | NaN   |

filled.head()

| Student name  | Student number    | Mark  | Grade     | Marked by     | Notes                 |
|-------------- |----------------   |------ |-------    |-----------    |--------------------   |
| Tara          | 31                | 71    | B1        | JL            |        Good           |
| Leah          | 40                | 54    | C2        | CL            | Needs more dragons    |
| john          | 16                | 53    | C2        | MG            |        Good           |
| Aisling       | 200               | 60    | B3        | MOB           |    keep working       |
| Adam          | 88                | 74    | B1        | KOM           |  don't forget apa     |

blank 是我的主文档,我想维护的顺序,填充包含为每个学生填写的成绩和其他信息,但它与 df1 的顺序不同。

我需要将 df2 中的“Mark”、“Grade”、“Marked by”和“Notes”列复制到 df1,保持 df1 的索引不变,并为每个学生复制正确的信息。

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    编辑:创建了问题中提供的填充和空白 dfs,因为在我之前代码的评论中提到了一个关键错误。

    输入:

    blank= pd.DataFrame({'Student name' : ['John','Mary','Colm','Ellen','Fionna'], "Student number": [16,19,17,20,21], 'Mark' : [np.NaN,np.NaN,np.NaN,np.NaN,np.NaN],'Grade' : [np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], 'Marked by' : [np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], 'Notes' : [np.NaN,np.NaN,np.NaN,np.NaN,np.NaN]})
    filled= pd.DataFrame({'Student name' : ['Tara','Leah','john','Aisling','Adam'], "Student number": [31,40,16,200,88], 'Mark' : [71,54,53,60,74],'Grade' : ['B1','C2','C2','B3','B1'], 'Marked by' : ['JL','CL','MG','MOB','KOM'], 'Notes' : ['Good','Needs more dragons','Good','keep working','dont forget apa']})
    

    空白:

      Student name  Student number  Mark Grade Marked by Notes
    0         John              16  53.0    C2        MG  Good
    1         Mary              19   NaN   NaN       NaN   NaN
    2         Colm              17   NaN   NaN       NaN   NaN
    3        Ellen              20   NaN   NaN       NaN   NaN
    4       Fionna              21   NaN   NaN       NaN   NaN
    

    填充:

      Student name  Student number  Mark Grade Marked by               Notes
    0         Tara              31    71    B1        JL                Good
    1         Leah              40    54    C2        CL  Needs more dragons
    2         john              16    53    C2        MG                Good
    3      Aisling             200    60    B3       MOB        keep working
    4         Adam              88    74    B1       KOM     dont forget apa
    

    假设“学生编号”是两个数据帧的共同键。代码如下:

    blank[['Mark','Grade','Marked by','Notes']] = blank.merge(filled,on='Student number')[['Mark_y', 'Grade_y','Marked by_y','Notes_y']]
    

    输出:

      Student name  Student number  Mark Grade Marked by Notes
    0         John              16  53.0    C2        MG  Good
    1         Mary              19   NaN   NaN       NaN   NaN
    2         Colm              17   NaN   NaN       NaN   NaN
    3        Ellen              20   NaN   NaN       NaN   NaN
    4       Fionna              21   NaN   NaN       NaN   NaN
    

    【讨论】:

    • 由于某种原因,我遇到了一个关键错误,但我知道你要去哪里了,谢谢,我会努力让它工作的。
    • 酷.. 我只从您的数据框中提取了几个样本并自己制作了。所以请仔细检查我的钥匙是否与你的拼写错误..
    • 请查看键周围的双括号,这可能会给您带来键错误[['Mark','Grade','Notes']]
    • 会用 iloc 修复它吗?
    • 不这么认为..您能否在问题中发布 df 定义.. 从 df.head() 复制非常困难
    【解决方案2】:

    我的第一个想法是使用学生编号作为两个数据帧的索引(我猜这些是唯一编号),然后像这样复制:

    blank.set_index('student number')
    filled.set_index('student number')
    
    list = ['Mark', 'Grade', 'Marked by', 'Notes'] 
    blank[list] = filled[list]
    

    ...不确定这是否适合您...

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2022-10-23
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多