Python 3.x 合并数据帧并创建派生列
给定2个数据帧 Med_DFPython 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
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})