【问题标题】:Merge pandas dataframes and create derived column合并熊猫数据框并创建派生列
【发布时间】:2019-07-01 17:46:16
【问题描述】:

给定 2 个 pandas 数据框

Med_DF

Key Med
 1  A
 1  B
 1  C
 2  A
 2  F
 3  A
 3  C
 3  E
 4  A
 4  B
 4  C
 4  D 

Key_DF

Key ID
1   A1
2   A2
3   A3
4   A4
5   A5

如何在不重复Keys 的情况下合并两者,将ID 与每个Key 匹配并在新列中创建派生变量?派生变量将返回每个ID 或空白/Nan 如果为 0 的药物数量,如下面的 Result_DF 所示

Result_DF

Key ID  Med
1   A1  3
2   A2  2
3   A3  3
4   A4  4
5   A5  

我的尝试

我确信我的解决方案过时且效率低下,这就是为什么我要求更清洁、可能更快的解决方案。尽管如此,我还是通过循环创建 Excel 公式来填充派生列并查找与Key 匹配的ID

# read in Med and Key files into dataframes
Med_DF = pd.read_csv(med_file, usecols = ['Key', 'Med'], encoding = 'utf-8', keep_default_na=False, na_values=[''])

Key_DF = pd.read_csv(key_file, usecols = ['Key', 'ID'], encoding = 'utf-8', keep_default_na=False, na_values=[''])

# add empty ID column to Med_DF
Med_DF.insert(0, "ID", "")

# assign length of dataframes
length_of_med = len(Med_DF)
length_of_key = len(Key_DF)

# create empty lists for formulas
med_countif = []
med_vlookup = []

# med VLOOKUP formulas 
for i in range(2,length_of_med+2):
    formula = '=VLOOKUP($B{0},Sheet1!$A:$B,2,FALSE)'.format(i)
    med_vlookup.append(formula)

# med COUNTIF formulas 
for i in range(2,length_of_key+2):
    formula = 
   '=IF(COUNTIF(Sheet1!$A:$A,$B{0})=0,"",COUNTIF(Sheet1!$A:$A,$B{0}))'.format(i)
    med_countif.append(formula)

# write formulas to columns
Key_DF.loc[:, "Meds"] = meds_formulas
Med_DF.loc[:, "Key"] = meds_vlookup

【问题讨论】:

    标签: python-3.x pandas merge


    【解决方案1】:

    joinvalue_countsGroupBy.size 一起用于计数值,值将转换为floats,因为至少有一个NaN - 不匹配值:

    df = Key_DF.join(Med_DF['Key'].value_counts().rename('Med'), on='Key')
    

    替代方案:

    df = Key_DF.join(Med_DF.groupby('Key').size().rename('Med'), on='Key')
    

    print (df)
       Key  ID  Med
    0    1  A1  3.0
    1    2  A2  2.0
    2    3  A3  3.0
    3    4  A4  4.0
    4    5  A5  NaN
    

    【讨论】:

      【解决方案2】:
      1. 在带有左外连接的 Key 上使用 pandas 与 Key_DFMed_DF 合并。

      2. 结果为@​​987654323@ Key, IDMed 计数函数

      import pandas as pd
      df = pd.merge(Key_DF,Med_DF[['Med','Key']],on='Key',how='left').groupby(["Key","ID"]).Med.agg({"Med":"count"})
      
      df
      
      Key ID  Med
      1   A1  3
      2   A2  2
      3   A3  3
      4   A4  4
      5   A5  0
      

      在这里,当我使用计数时,我将第 5 行设为 0。所以,如果需要得到 Nan,我们可以再增加一步,用 Nan 替换 0

      import numpy as np
      df.Med.replace({0:np.nan})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-31
        • 2013-09-26
        • 1970-01-01
        • 2019-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多