【问题标题】:Add a new column to Pandas DataFrame with coding data from a separate DataFrame without using a Loop?在不使用循环的情况下向 Pandas DataFrame 添加一个新列,其中包含来自单独 DataFrame 的编码数据?
【发布时间】:2013-02-20 00:58:03
【问题描述】:

我遇到的问题是我有一个大型数据框(约 300,000 行),每个主题的多行代表不同条件下的给定值。简化版如下图:

In [12]: df1
Out[12]:
   SubID  Condition  Value
0      1          1  0.123
1      1          2  0.234
2      2          1  0.345
3      2          2  0.456
4      3          1  0.567
5      3          2  0.678
6      4          1  0.789

我还有第二张表,其中只有 80 行奇数行,其中包含受试者所属的基因组。

我希望将该数据添加到第一个 DataFrame。编码表的简化版如下所示:

In [17]: df2
Out[17]:
   Subject Number Genetic Group
0               1             A
1               2             C
2               3             A
3               4             B

我想结束的是:

In [19]: df1
Out[19]:
   SubID  Condition  Value Genetic Group
0      1          1  0.123             A
1      1          2  0.234             A
2      2          1  0.345             C
3      2          2  0.456             C
4      3          1  0.567             A
5      3          2  0.678             A
6      4          1  0.789             B

我可以使用 for: 循环,但想知道是否有使用任何 Pandas DataFrame 合并或加入操作的方法可以避免这种情况?非常感谢,

【问题讨论】:

    标签: python dataframe pandas


    【解决方案1】:

    另一种方式是:

    In [1]: import pandas as pd
    
    In [2]: a = pd.DataFrame({"SubID":[1,1,2,2], "Condition":[1,2,1,2], "Value":[.123,.234,.345,.456]})
    
    In [3]: a
    Out[3]: 
       Condition  SubID  Value
    0          1      1  0.123
    1          2      1  0.234
    2          1      2  0.345
    3          2      2  0.456
    
    In [4]: a = a.set_index(["SubID","Condition"]).unstack()
    
    In [5]: b = pd.DataFrame({"Subject Number":[1,2], "Genetic Group":['A','C']})
    
    In [6]: b
    Out[6]: 
      Genetic Group  Subject Number
    0             A               1
    1             C               2
    
    In [7]: b["Condition"] = "Genetic Group"
    
    In [8]: b = b.rename(columns={"Genetic Group":"Value"})
    
    In [9]: b = b.set_index(["Subject Number","Condition"]).unstack()
    
    In [10]: b
    Out[10]: 
                           Value
    Condition      Genetic Group
    Subject Number              
    1                          A
    2                          C
    
    In [11]: r = a.merge(b, left_index=True, right_index=True)
    
    In [12]: r
    Out[12]: 
               Value                Value
    Condition      1      2 Genetic Group
    SubID                                
    1          0.123  0.234             A
    2          0.345  0.456             C
    
    In [13]: r = r.unstack()
    
    In [14]: r = r.swaplevel(0,2).sort_index()
    
    In [15]: r
    Out[15]: 
    SubID  Condition           
    1      1              Value    0.123
           2              Value    0.234
           Genetic Group  Value        A
    2      1              Value    0.345
           2              Value    0.456
           Genetic Group  Value        C
    

    【讨论】:

    • 谢谢马克西姆。我今天又看了你的回复(现在我又在我的电脑前),这是有道理的。我认为这可能对我稍后需要执行的其他操作很有用,因此感谢您抽出时间回复。
    • @PhilipLawrence 我应该添加更多 cmets,但没有足够的时间。基本上,您的数据采用 narrow 格式。我首先将其转换为 long 格式,其中每个值类型都有自己的列,然后添加另一个包含类别的列,然后将其转换回 narrow 格式。
    【解决方案2】:

    您可以通过 SubID 进行索引,然后使用join 获取您想要的内容:

    df1.set_index("SubID", inplace=True)
    df2.set_index("Subject Number", inplace=True)
    df3 = df1.join(df2, how="left")
    

    或者,您可以使用merge 来完成而不使用索引:

    df3 = df1.merge(df2, left_on="SubID", right_on="Subject Number", how="left")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-09
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      相关资源
      最近更新 更多