合并熊猫数据框并创建派生列

时间:2019-02-07 15:01:11

标签: python-3.x pandas merge

给出2个熊猫数据框

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公式来填充派生的列并查找与ID相匹配的Key

# 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

2 个答案:

答案 0 :(得分:1)

使用joinvalue_countsGroupBy.size来计数值,因为至少有一个float-不匹配的值,所以值被转换为NaN s:

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

答案 1 :(得分:0)

  1. 使用带有左外部联接的Key上的Key_DFMed_DF合并熊猫。

  2. 结果为groupby的{​​{1}}和Key, ID个计数函数

Med
import pandas as pd
df = pd.merge(Key_DF,Med_DF[['Med','Key']],on='Key',how='left').groupby(["Key","ID"]).Med.agg({"Med":"count"})

在这里,我使用count时将第5行设为0。因此,如果需要获得Nan,我们可以再增加一个步骤以用Nan替换0

df

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