Python 3.x 合并数据帧并创建派生列

Python 3.x 合并数据帧并创建派生列,python-3.x,pandas,merge,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 ID 1 A1 2 A2 3 A3 4 A4 5 A5 Key ID Med 1 A1 3 2 A2 2 3 A3 3 4 A4 4 5 A5 键_DF Key Med 1 A 1 B 1 C 2 A 2 F 3 A

给定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 ID
1   A1
2   A2
3   A3
4   A4
5   A5
Key ID  Med
1   A1  3
2   A2  2
3   A3  3
4   A4  4
5   A5  
键_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 ID
1   A1
2   A2
3   A3
4   A4
5   A5
Key ID  Med
1   A1  3
2   A2  2
3   A3  3
4   A4  4
5   A5  
如何合并这两个键而不重复
,将
ID
与每个
匹配,并在新列中创建派生变量?派生变量将返回每个
ID
的用药次数,如果为0,则返回空白的
Nan
,如下面的结果所示

结果\u 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 ID
1   A1
2   A2
3   A3
4   A4
5   A5
Key ID  Med
1   A1  3
2   A2  2
3   A3  3
4   A4  4
5   A5  
我尝试过的

我确信我的解决方案过时且效率低下,这就是为什么我要求一个更干净、可能更快的解决方案。尽管如此,我还是通过循环创建Excel公式来填充派生列,并查找与
键匹配的
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
与计数值一起使用或用于计数值时,值会转换为
浮点
s,因为至少有一个
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')

  • 在具有左外连接的键上使用熊猫合并键和
    Key_DF
    Med_DF

  • 通过
    Med
    count功能,使用
    groupby
    键的结果
    ID

  • 在这里,我得到第五行作为0,因为我使用计数。因此,如果需要获得Nan,我们可以再添加一个步骤,用Nan替换0

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